【问题标题】:Why does the program display warning passing argument 1 of 'circularswap' makes pointer from integer without a cast?为什么程序显示警告传递'circularswap'的参数1使指针从整数而不进行强制转换?
【发布时间】:2021-01-25 07:26:35
【问题描述】:

我正在解决这个问题:

Given an array p[5], write a function to shift it circularly left by two positions. Thus, if p[0] = 15, p[1]= 30, p[2] = 28, p[3]= 19 and p[4] = 61 then after the shift p[0] = 28, p[1] = 19, p[2] = 61, p[3] = 15 and p[4] = 30. Call this function for a (4 x 5 ) matrix and get its rows left shifted.

这是我尝试过的代码:

    #include <stdio.h>
    
#include <stdio.h>
void circularswap(int arr[][5],int n,int m){ int arr1[n][m],i,j;
    for (i=0;i<n;i++){
        for (j=0;j<m;j++){
            arr1[i][j]=*(*(arr+i)+j);
        }
    }
    for (i=0;i<m;i++){
        *(*(arr+i)+0)=arr1[i][2];
        *(*(arr+i)+1)=arr1[i][3];
        *(*(arr+i)+2)=arr1[i][4];
        *(*(arr+i)+3)=arr1[i][0];
        *(*(arr+i)+4)=arr1[i][1];
    }
        for (i=0;i<4;i++){
        for (j=0;j<5;j++){
            printf ("%d",arr[i][j]);
        }
        printf ("\n");
    }
}
int main(){ int i,j;
    int arr[4][5]={(15,30,28,19,61),(15,30,28,19,61),(15,30,28,19,61),(15,30,28,19,61)};
    circularswap((arr,4,5));
    return 0;
}

不幸的是,这会显示警告。有人可以告诉为什么会弹出警告以及如何删除它们吗?

【问题讨论】:

  • “很遗憾,这会显示警告” - 你认为这些警告是什么意思?而且这段代码应该发出比你提到的更多的警告。
  • 编辑后的代码请大家看
  • 我的道歉@WhozCraig,由于我是编程新手,请您更正代码吗?
  • *(*(arr+i)+j) 请忘记这一点。总是写arr[i][j],谢谢!

标签: arrays c function pointers


【解决方案1】:

调用函数时需要使用很多括号。

表达式(arr,4,5) 使用the comma operator 并将计算列表中的所有子表达式,但只返回5

即你的电话真的和circularswap(5)一样,在很多方面都是不正确的。

要解决您的问题,请删除内括号:

circularswap(arr,4,5);

您在初始化数组时遇到了类似的问题:您使用括号 () 而不是花括号 {}

所以数组定义真的等于:

int arr[4][5]={ { 61 }, { 61 }, { 61 }, { 61 } };

[注意我在上面的例子中如何使用花括号]


另一方面,对于任何指针p 和索引i,表达式*(p + i) 完全 等于p[i]。后者更容易阅读和理解,也更不容易写。

当你像你一样使用数组时,这尤其重要,例如*(*(arr+i)+0) 可以替换为 arr[i][0]

【讨论】:

  • 这会导致分段错误
  • 是否需要进行其他更改?
【解决方案2】:

你声明了一个二维数组

 int arr[4][5]

所以数组的元素又是一维数组。如果数组元素类型为 char,则可以通过初始化列表或字符串字面量初始化一维数组。

但是,您正在使用带有逗号运算符的标量类型的表达式,例如

(15,30,28,19,61)

表达式的值是最后一个操作数61 的值。事实上你的初始化看起来像

int arr[4][5]=
{
    [0] = 61,
    [1] = 61,
    [2] = 61,
    [3] = 61
};

引擎盖下的样子

a[0] = 61;

也就是说,您正在尝试将值 61 分配给 int[5] 类型的数组。

您需要将列表括在大括号中,例如

int arr[4][5] =
{
    { 15, 30, 28, 19, 61 },
    { 15, 30, 28, 19, 61 },
    { 15, 30, 28, 19, 61 },
    { 15, 30, 28, 19, 61 }
};

在作业中还写道,您需要编写一个函数,将一维数组的元素向左移动。但是在你的程序中没有这样的功能。

此外,您的函数circularswap 有错误。例如在这个循环中

for (i=0;i<m;i++){
    *(*(arr+i)+0)=arr1[i][2];
    *(*(arr+i)+1)=arr1[i][3];
    *(*(arr+i)+2)=arr1[i][4];
    *(*(arr+i)+3)=arr1[i][0];
    *(*(arr+i)+4)=arr1[i][1];
}

这里使用了变量m 而不是n 和像4 这样的幻数。因此,在内循环中使用变量m 而不是变量n 并使用幻数4 而不是使用变量m 会使你的循环毫无意义。

此外,尽管在赋值中写入了将行的元素循环移位 2 个位置,但您应该始终编写一个更通用的函数,允许用户指定移位次数。

因此,您需要编写一个将元素循环向左移动的函数,并为每一行调用该函数,指定移动次数等于 2。

程序可以如下所示。

#include <stdio.h>
#include <string.h>

void circular_shift_left( int a[], size_t n, size_t pos )
{
    if ( n != 0 )
    {
        pos = pos % n;
    
        if ( pos != 0 )
        {
            for ( size_t i = 0; i < pos; i++ )
            {
                int tmp = a[0];
                memmove( a, a + 1, ( n - 1 ) * sizeof( *a ) );
                a[n-1] = tmp;
            }
        }           
    }
}

int main(void) 
{
    enum { M = 4, N = 5 };
    int a[M][N] =
    {
        { 15, 30, 28, 19, 61 },
        { 15, 30, 28, 19, 61 },
        { 15, 30, 28, 19, 61 },
        { 15, 30, 28, 19, 61 }
    };
    
    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            printf( "%d ", a[i][j] );
        }
        putchar( '\n' );
    }
    
    putchar( '\n' );
    
    for ( size_t i = 0; i < M; i++ )
    {
        circular_shift_left( a[i], N, 2 );
    }
    
    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            printf( "%d ", a[i][j] );
        }
        putchar( '\n' );
    }
    
    putchar( '\n' );
    
    
    return 0;
}

程序输出是

15 30 28 19 61 
15 30 28 19 61 
15 30 28 19 61 
15 30 28 19 61 

28 19 61 15 30 
28 19 61 15 30 
28 19 61 15 30 
28 19 61 15 30 

【讨论】:

  • 你能告诉我为什么我的循环没有意义吗?
  • 这是我正在谈论的代码,而不是原始问题中发布的代码
  • @GirGr 对于初学者,行数由变量 n 指定,而不是由变量 m 指定。其次,您使用的是幻数 4,而不是使用带有变量 m 的循环。
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 2011-07-05
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
相关资源
最近更新 更多