我一直在重写我的一些函数来返回int而不是结构,以便我可以这样做
if ( function(&struct1,vars) != 0 )
{
// die and give error
}
而不是:
struct = function(vars);
我在这里缺少一些概念,因为每当我尝试在main中访问我的struct的值时,我都没有得到函数中赋给它的值。如果有人可以向我解释我的记忆/变量究竟发生了什么(我会写出我认为发生的事情)以及为什么它不起作用我会非常感激。
主要(缩短):
int main (int argc, char *argv[]) {
arguments args;
data data;
scan scans;
printf("Value at start %i\n",scans.number);
if (scan_extractor(&args,&scans) != 0) // Pass the reference of the struct to scan_extractor (while still being un-initilizaed, something I don't quite grasp).
{
printf("Error in argument reader\n");
exit(0);
} else {
printf("Main thinks %i scans\n",scans.number);
}
return(0);
}
function(scan_extractor):
int
scan_extractor(arguments* args, scan* scans)
{
FILE* fr;
int counter = 0;
fr = fopen(args->scans,"r");
scans = calloc(MAX,sizeof(scan)); // Allocate memory to store multiple instances of the scan object
while (fgets(mzML_buffer,MAX_BUFFER,fr) != NULL)
{
(scans+counter)->id = atoi(mzML_buffer); // Modify the global version of scans
counter++;
}
scans->number = counter;
printf("Function read %i scans\n",scans->number);
return(0);
}
读取的文件包含1行,其中包含值1
我得到的输出是:
Value at start 32767
Function read 1 scans
Main thinks 32767 scans
为什么这让我感到疯狂的是,包含输入参数的几乎相同的代码块可以使用类似的语法从main访问(只有struct *的struct参数值与结构扫描的int值)。
答案 0 :(得分:1)
scan_extractor(arguments* args, scan* scans)
scans = calloc(MAX,sizeof(scan));
您正在为正在传递的指针的副本分配内存。能够为函数内部的指针分配内存。您需要通过引用传递指针:
scan_extractor(arguments* args, scan** scans)
*scans = calloc(MAX,sizeof(scan));
再想一想。你的程序没有意义。你混合了两个概念
您在本地存储上分配scan
对象并将其地址传递给该函数。在函数内部,您将动态内存分配给指针的本地函数,该函数以前指向传递的对象。这只会泄漏内存,而基于堆栈的scan
对象永远不会填充
基本上,您只需要传递对象的地址并使用该对象。它已被分配,不需要在函数内部进行分配。
scan scans;
if (scan_extractor(&args,&scans)
scan_extractor(arguments* args, scan* scans)
scans->number = counter;
答案 1 :(得分:1)
您需要第二级间接才能返回已分配的单元。函数scan_extractor应如下所示:
int scan_extractor(arguments* args, scan** scans)
{
FILE* fr;
int counter = 0;
fr= fopen(args->scans,"r");
*scans = calloc(MAX,sizeof(scan));
while (fgets(mzML_buffer,MAX_BUFFER,fr) != NULL)
{
((*scans)[counter]).id = atoi(mzML_buffer); // Modify the global version of scans
counter++;
}
(*scans)->number = counter;
printf("Function read %i scans\n",(*scans)->number);
return(0);
}
看一下这段代码告诉我,(*scans)->number = counter;
和printf("Function read %i scans\n",(*scans)->number);
行无论如何都是错误的,但我不知道扫描结构。我想我可以猜出意图(存储扫描次数)。我建议通过略微修改的方法来解决这个问题:
typedef struct scanlist {
unsigned int count;
scan *scans;
}scanlist;
...
int scan_extractor(arguments* args, scanlist* scans)
{
scans->scans = calloc(MAX,sizeof(scan));
...
while (...) {
scans->scans[counter].id = ...
}
...
scans->count = counter;
否则,您每次扫描都不需要使用数字字段来浪费内存。