所以,我正在使用一些C代码。我已经定义了以下功能:
int load_csv(size_t L, size_t W, CSV_DATA csv_data[L][W], char file[])
如果我调用此函数,一切正常。
但是,如果我更改前两个参数的顺序,那么函数定义如下:
int load_csv(size_t W, size_t L, CSV_DATA csv_data[L][W], char file[])
当我尝试将数据保存到csv_data时,我遇到了段错误。任何人都可以深入了解为什么在struct参数(在本例中为csv_data)之前定义的参数必须处于相同顺序的原因?
编辑:根据要求,这是整个功能:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
enum { is_int, is_float, is_char } type;
int ival;
char cval[10];
float fval;
}CSV_DATA;
int load_csv(size_t L, size_t W, CSV_DATA csv_data[L][W], char file[])
{
char buffer[1024] ;
char *record,*line;
int i = 0;
FILE *fstream = fopen("iris.csv","r");
if(fstream == NULL)
{
printf("\n file opening failed ");
return -1 ;
}
while((line=fgets(buffer,sizeof(buffer),fstream))!=NULL)
{
int j = 0;
record = strtok(line,",");
printf("%s", record);
while(record != NULL)
{
csv_data[i][j].type = is_char;
for (int k=0; k < strlen(record); k++){
csv_data[i][j].cval[k] = record[k];//record;
}
j++;
record = strtok(NULL,",");
//printf("%s", record);
}
++i;
}
return 0;
}
编辑:这里是调用代码。尽管如此......我没有在被叫函数中的任何地方使用L或W ......
int main(){
int L = 500;
int W = 50;
CSV_DATA csv_data[500][50];
char file[10] = "iris.csv";
load_csv(L ,W , csv_data, file);
return 0;
}
答案 0 :(得分:1)
顺序无关紧要 - 你更可能使用已更改的函数内部的值进行操作 - 是否更改了调用函数的值的顺序?
答案 1 :(得分:1)
如果在函数定义中交换参数的顺序,则还需要在数组参数声明或函数调用中交换它们。 IOW,如果你改变了
int load_csv(size_t L, size_t W, CSV_DATA csv_data[L][W], char file[])
到
int load_csv(size_t W, size_t L, CSV_DATA csv_data[L][W], char file[])
然后要么需要更改csv_data
的声明:
int load_csv(size_t W, size_t L, CSV_DATA csv_data[W][L], char file[])
或您需要在调用函数中更改参数顺序:
load_csv(L, W, csv_data, file);
到
load_csv(W, L, csv_data, file);
否则,csv_data
中load_csv
的维度将与csv_data
中main
的维度相反,导致某些时候超出范围的数组访问。