du borde inte få varken slut på minne eller få särskilt mycket heap fragmentation
speciellt inte om du kör med exakt det programmet som angivits
och de #defines
samt bara en gång
det kan också vara "undefined behaviour" att göra return på main funktion i MCU sammanhang
så bäst är att göra en vanlig while(1) {} istället när du kör koden på MCU
ska gå att göra:
Kod: Markera allt
#ifdef _MSC_VER
// Kör på MSVC
return EXIT_SUCCESS;
#else
// Kör på andra kompilatorer (t.ex. GCC på ARM)
while(1) {} // loopar oändligt istället för att returnera
#endif
alltså när man använder variadic så försvinner const
så det är ganska meningslöst att använda det på funktionsanropets parametrar
här är ett omskrivning ifrån chatgpt (som är baserad på ett påstående som jag trodde på och är tydligen fel):
const är ett 'promise' som anger att en variabel inte får ändras.
Kompilatorn använder det både för att varna vid försök till skrivning och för optimeringar.
Att casta bort const för att skriva till en sådan variabel är undefined behavior — det kan ibland fungera på vissa plattformar,
men kan också ge krascher eller oväntade värden, särskilt på system med read-only memory.
Man kan alltså inte lita på att skrivning via en sådan cast är säker.
det verkar också som så att mvcc är mera tillåtande, alltså matchningen mellan argumenten och när man sedan använder va_arg
i jämförelse med gcc så det kan vara någon matchningsfel där som optimeras bort
så
Kod: Markera allt
rows[i] = va_arg(args, const size_t);
columns[i] = va_arg(args, const size_t);
ska vara
Kod: Markera allt
rows[i] = va_arg(args, size_t);
columns[i] = va_arg(args, size_t);
efterssom följande inte är const och kan inte heller vara det:
Anropet kan göras utan const eftersom de ändå ignoreras i variadic-funktionen.
Kod: Markera allt
rk4args(ITERATIONS, h, Y, y0, N, odefun, number_of_pointers, A, (size_t)row_a, (size_t)column_a, B, (size_t)row_b, (size_t)column_b, u, (size_t)row_u, (size_t)column_u);
här är en lista på övriga varningar:
Kod: Markera allt
C:\TestFörProgram\VariadicEF>gcc -Wall -Wextra -Wformat -Werror main.c
main.c: In function 'odefun':
main.c:196:12: error: unused variable 'column_U' [-Werror=unused-variable]
196 | size_t column_U = columns[2];
| ^~~~~~~~
main.c:195:12: error: unused variable 'row_U' [-Werror=unused-variable]
195 | size_t row_U = rows[2];
| ^~~~~
main.c:184:25: error: unused parameter 't' [-Werror=unused-parameter]
184 | void odefun(const float t, float y[], float* matrices[], const size_t rows[], const size_t columns[]) {
| ~~~~~~~~~~~~^
cc1.exe: all warnings being treated as errors
att const float t inte används innebär också att den inte behövs i rk4args heller
men det kan ju vara så att du använder den när du använder andra callbacks så kanske bäst är att låta dem vara
För övrigt hade inte printf fungerat utan variadic, åtminstone inte lika dynamiskt som det gör nu.
kan ju hålla med om att man borde använda dynamisk allokering så lite som möjligt
(men att helt undvika det gör det mycket svårt att tex tillåta dynamiska filer som innehåller dynamisk konfigurering samt inläsning och tolkning av runtime scripts)
i min begynnelse av mcu så användes pic16f877 så där var inget alternativ och jag använde ren c samt assembly
håller på med ett relativt stort projekt nu och det är ganska svårt att få chatGPT att undvika att använda std::stack samt std::vector
den tjatar också om att använda smarta pekare vilket jag helst inte vill då jag i detta fall vill ha full kontrol på vad som händer utan att gräva för mycket i c++
samt vill undvika onödigheter.
Jag kommer göra ett inlägg om det projektet ganska snart, men exakt när är inte bestämt.