相同的代码在 main 中有效,但在从 C 中的函数调用时无效
Same code works in main, but not when calling from a function in C
好的,我是一名初级程序员,因此非常感谢有关代码任何部分的任何提示,
但主要问题是为什么函数 int longestSequence(int n,int array[n]);
中的代码放在 main 中时有效,但从函数中调用时却无效?
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int longestSequence(int n,int array[n]);
int main()
{
int n;
scanf("%d", &n);
int mat[n][n];
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
scanf("%d", &mat[i][j]);
}
}
int arraySize = n*n;
int array[arraySize];
int arrayIndex = 0;
for(int i=0; i<n; i++){
if(i%2 == 0){
for(int j = 0; j<n; j++){
array[arrayIndex++] = mat[i][j];
}
}else{
for(int j = n-1; j>=0; j--){
array[arrayIndex++] = mat[i][j];
}
}
}
/// Here's the same code that works when in main
// int numOfSequental = 0;
// int maxNumOfSequental = INT_MIN;
// for(int i = 0; i<n; i++){
// if(niz[i] == (niz[i+1]-1)){
// numOfSequental++;
// if(numOfSequental>maxNumOfSequental){
// maxNumOfSequental = numOfSequental;
// }
// continue;
// }
// numOfSequental = 0;
// }
//calling the function in printf
printf("Length of the sequence: %d", longestSequence(arraySize, array[arraySize]));
return 0;
}
int longestSequence(int n,int array[n])
{
int numOfSequental = 0;
int maxNumOfSequental = INT_MIN;
for(int i = 0; i<n; i++){
if(array[i] == (array[i+1]-1)){
numOfSequental++;
if(numOfSequental>maxNumOfSequental){
maxNumOfSequental = numOfSequental;
}
continue;
}
numOfSequental = 0;
}
return maxNumOfSequental+1;
}
"the main question is why does the code in function int longestSequence(int n,int array[n]);
work when placed in main, but not
when called from the function?"
正如所称,它在任何地方都不起作用。
printf("Length of the sequence: %d", longestSequence(arraySize, array[arraySize]));
// ^^^^^^^^^^^
return 0;
首先请注意,通过的索引:arraySize
超出了 array
的合法索引。在 C 中,索引是从零开始的,因此它从 0
- arraySize - 1
更重要的是 longestSequence
的第二个参数应该是指向数组的指针,而不是数组的索引元素。
printf("Length of the sequence: %d", longestSequence(arraySize, array));
return 0;
另外,一般来说,要比较大小为n
的数组中的后续数字,比较的范围应该限制在:
a[i] == a[i+1] //for i == 0 through i == n-1
变化:
for(int i = 0; i<n; i++){
// ^^^
if(array[i] == (array[i+1]-1)){//array out of bounds when i == n
// ^^^
到
for(int i = 0; i<n-1; i++){
// ^^^^^
if(array[i] == (array[i+1]-1)){//i will never reach n
编辑:
最后一件事解决了关于使用 main 的第二个参数替换对 scanf()
的调用的评论。首先,代码必须包含 main 的原型:int main(int argc, char *argv[]);
。有了这个原型,从命令行调用的程序现在可以包含命令行参数,例如:if 运行 from CMD prompt in Windows:
C:\dev> myProg.exe 3 1 2 3 4 5 6 7 8 9
在您的程序中,argc
和 argv[]` 的参数填充如下:
argc == 11 //total number of arguments
argv[0] == "myProg.exe" //program name is alway in argv[0]
argv[1] == "3"
argv[2] == "1"
...
argv[10] == "9"
这应该转化为创建一个填充有 9 个后续值的 3x3 数组。
因此您的代码中的第一条语句现在可以是:(在伪代码中)
int n = atoi(argv[1]);//check value of n before using
int array[n][n];
int index = 2;
for(int i = 0; i<n ; i++)
for(int j = 0; j<n ; j++)
array[i][j] = atoi(argv[index]);
index++;
好的,我是一名初级程序员,因此非常感谢有关代码任何部分的任何提示,
但主要问题是为什么函数 int longestSequence(int n,int array[n]);
中的代码放在 main 中时有效,但从函数中调用时却无效?
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int longestSequence(int n,int array[n]);
int main()
{
int n;
scanf("%d", &n);
int mat[n][n];
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
scanf("%d", &mat[i][j]);
}
}
int arraySize = n*n;
int array[arraySize];
int arrayIndex = 0;
for(int i=0; i<n; i++){
if(i%2 == 0){
for(int j = 0; j<n; j++){
array[arrayIndex++] = mat[i][j];
}
}else{
for(int j = n-1; j>=0; j--){
array[arrayIndex++] = mat[i][j];
}
}
}
/// Here's the same code that works when in main
// int numOfSequental = 0;
// int maxNumOfSequental = INT_MIN;
// for(int i = 0; i<n; i++){
// if(niz[i] == (niz[i+1]-1)){
// numOfSequental++;
// if(numOfSequental>maxNumOfSequental){
// maxNumOfSequental = numOfSequental;
// }
// continue;
// }
// numOfSequental = 0;
// }
//calling the function in printf
printf("Length of the sequence: %d", longestSequence(arraySize, array[arraySize]));
return 0;
}
int longestSequence(int n,int array[n])
{
int numOfSequental = 0;
int maxNumOfSequental = INT_MIN;
for(int i = 0; i<n; i++){
if(array[i] == (array[i+1]-1)){
numOfSequental++;
if(numOfSequental>maxNumOfSequental){
maxNumOfSequental = numOfSequental;
}
continue;
}
numOfSequental = 0;
}
return maxNumOfSequental+1;
}
"the main question is why does the code in function
int longestSequence(int n,int array[n]);
work when placed in main, but not when called from the function?"
正如所称,它在任何地方都不起作用。
printf("Length of the sequence: %d", longestSequence(arraySize, array[arraySize]));
// ^^^^^^^^^^^
return 0;
首先请注意,通过的索引:arraySize
超出了 array
的合法索引。在 C 中,索引是从零开始的,因此它从 0
- arraySize - 1
更重要的是 longestSequence
的第二个参数应该是指向数组的指针,而不是数组的索引元素。
printf("Length of the sequence: %d", longestSequence(arraySize, array));
return 0;
另外,一般来说,要比较大小为n
的数组中的后续数字,比较的范围应该限制在:
a[i] == a[i+1] //for i == 0 through i == n-1
变化:
for(int i = 0; i<n; i++){
// ^^^
if(array[i] == (array[i+1]-1)){//array out of bounds when i == n
// ^^^
到
for(int i = 0; i<n-1; i++){
// ^^^^^
if(array[i] == (array[i+1]-1)){//i will never reach n
编辑:
最后一件事解决了关于使用 main 的第二个参数替换对 scanf()
的调用的评论。首先,代码必须包含 main 的原型:int main(int argc, char *argv[]);
。有了这个原型,从命令行调用的程序现在可以包含命令行参数,例如:if 运行 from CMD prompt in Windows:
C:\dev> myProg.exe 3 1 2 3 4 5 6 7 8 9
在您的程序中,argc
和 argv[]` 的参数填充如下:
argc == 11 //total number of arguments
argv[0] == "myProg.exe" //program name is alway in argv[0]
argv[1] == "3"
argv[2] == "1"
...
argv[10] == "9"
这应该转化为创建一个填充有 9 个后续值的 3x3 数组。
因此您的代码中的第一条语句现在可以是:(在伪代码中)
int n = atoi(argv[1]);//check value of n before using
int array[n][n];
int index = 2;
for(int i = 0; i<n ; i++)
for(int j = 0; j<n ; j++)
array[i][j] = atoi(argv[index]);
index++;