gpt4 book ai didi

c - 动态 C - 使用 writeUserBlockArray() 时出错

转载 作者:行者123 更新时间:2023-11-30 19:50:04 24 4
gpt4 key购买 nike

编辑 - 以下是回应评论的一些资源:

海岸:http://bamafolks.com/randy/students/embedded/dynamicC_mtask.html

写入用户 block 数组:http://ftp1.digi.com/support/documentation/html/DynCFunctionReference/12fun595.htm#1259708

我收到的错误是“-1:无效的地址或范围”。

#define MAX_SAMPLES 20
#define REPORT_AFTER 3

main()
{
int i;
int report;

int write_result;
int read_result;

struct temp_struct {
float celcius;
float fahrenheit;
} temperature_data;

struct temp_struct save_data[MAX_SAMPLES];
struct temp_struct read_data[MAX_SAMPLES];
unsigned int save_lens[MAX_SAMPLES];

float *pTempC, *pTempF;

pTempC = &temperature_data.celcius;
pTempF = &temperature_data.fahrenheit;

i = 0;
report = 0;

brdInit();

while(1)
{
costate
{
sampleTemp(&temperature_data.celcius, &temperature_data.fahrenheit);

save_data[i].celcius = *pTempC;
save_data[i].fahrenheit = *pTempF;
save_lens[i] = sizeof(temperature_data);

if(i==MAX_SAMPLES) i=0; else i++;
report=1; // Sample has been taken, a report can be produced
waitfor(DelaySec(SAMPLE_DELAY_SECS));
}

// If REPORT_AFTER set to 3, this executed every third sample taken.
// "report" the last set of data saved by printing out
if(report && i%REPORT_AFTER==0 && i!=0)
{
write_result = writeUserBlockArray(i-REPORT_AFTER, save_data, save_lens, REPORT_AFTER);
// Read data to check it was saved correctly
read_result = readUserBlockArray(read_data, save_lens, REPORT_AFTER, i-REPORT_AFTER);

// Print out all data saved here.

report = 0; // Do not report again until another sample has been taken.
break; // Stops after first report. Can be removed later
} // end if
} // end while
} // end main

float sampleTemp(float *tempC, float *tempF)
{
auto float Tk, //calculated temperature kelvins
Draw; //raw data value
auto int i;

printf("Getting temperature\n\n");

Draw = anaIn(7, SINGLE, GAIN_1);

//calculate temperature in kelvins
Tk = (Bt*Tkstd) / ( Tkstd * ( log( fabs( (-Draw*Rs) / (Rtstd*(Draw-(Dmax*Gain))) ) ) ) + Bt );

*tempC = Tk - 273.15; //convert to celcius
*tempF = 1.8*(Tk - 255.37); //calculate fahrenheit

return 0;
}

这是所有相关代码。我始终从 writeUserBlockArray() 方法返回 -1,该方法表示无效地址或范围。

我不认为它是 Dynamic-C 的事实有多大区别,但有问题的方法的概要是这样的:

writeUserBlockArray(addrOffset, arraySources, arraySourceSizes, numSources);

我是 C 语言新手,我认为我将数据保存到数组的方式有问题?

提前致谢。

最佳答案

问题是我试图将数据数组写入内存。使用 writeUserBlockArray(...) 方法的实际方法是指定一个指针数组。

新的、工作的代码:

#define SAMPLE_DELAY_SECS 5
#define MAX_SAMPLES 20
#define REPORT_AFTER 3

main()
{
int temp;

int i; // Iteration #
int report; // Whether to produce a report or not

int write_result; // The numerical result of the write-to-memory operation
int read_result; // The numerical result of the read-from-memory operation

// Define a structure which can be used to hold both temperature measurements
struct temp_struct {
float celcius;
float fahrenheit;
} temperature_data;

void *save_pointers[MAX_SAMPLES]; // An array of pointers pointing to the data to be saved in memory
struct temp_struct save_data[MAX_SAMPLES]; // Array of actual data which can be loaded with the read operation
unsigned int save_lens[MAX_SAMPLES]; // An array of the size (in bytes) of each element in the save_data array

i = 0;
report = 0;

brdInit(); // Needs to be called before any operations are performed with the hardware.

while(1)
{
/*
* Costate is a way of multitasking in Dynamic-C. By using a costate block in
* conjunction with the waitfor keyword, the block can be paused until it
* has finished waiting.
*
* Further info:
* http://bamafolks.com/randy/students/embedded/dynamicC_mtask.html
*/
costate
{
// Method taken from: http://read.pudn.com/downloads107/sourcecode/embed/441399/Samples/RCM3700/Tcpip/RabbitWeb/TEMPERATURE.C__.htm
sampleTemp(&temperature_data.celcius, &temperature_data.fahrenheit);

save_pointers[i] = &temperature_data;
save_lens[i] = sizeof(temperature_data);

printf("save_data[%d].celcius is %f\n", i, save_data[i].celcius);
printf("save_data[%d].fahrenheit is %f\n\n", i, save_data[i].fahrenheit);

if(i==MAX_SAMPLES) i = 0; else i++;

report=1; // Sample has been taken, a report can be produced
waitfor(DelaySec(SAMPLE_DELAY_SECS));
}

/*
* This IF block is used to produce a report every so often, either by
* emailing out some data, updating the web interface or simply printing
* it to the screen.
*
* A report will be produced when:
* a) a new sample has been taken (report)
* b) the desired number of samples has been reached (i%REPORT_AFTER==0)
* c) it is not the very first sample to be taken (i!=0)
*/
if(report && i%REPORT_AFTER==0 && i!=0) // For every third sample
{
/*
* writeUserBlockArray(address_offset (unsigned int),
* sources (array),
* source_sizes (array),
* num_sources (int));
* Documentation:
* http://ftp1.digi.com/support/documentation/html/DynCFunctionReference/12fun595.htm#1259708
*/
write_result = writeUserBlockArray(i-REPORT_AFTER, save_pointers, save_lens, REPORT_AFTER);

/*
* readUserBlockArray(destinations (array),
* destination_sizes (array),
* num_sources (int),
* address_offset (unsigned int));
* Documentation:
* http://ftp1.digi.com/support/documentation/html/DynCFunctionReference/12fun441.htm#1259907
*/
read_result = readUserBlockArray(save_data, save_lens, REPORT_AFTER, i-REPORT_AFTER);

printf("Write Result: %d\nRead Result: %d\n\n", write_result, read_result);

printf("Most recent data...\n");
for(temp = 0; temp < REPORT_AFTER; temp++)
{
printf("save_data[%d].C: %f\n", temp, save_data[temp].celcius);
printf("save_data[%d].F: %f\n", temp, save_data[temp].fahrenheit);
}

report = 0; // Do not report again until another sample has been taken.
}// End if
}// End while
}// End main

关于c - 动态 C - 使用 writeUserBlockArray() 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8666612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com