[C] sizeof na functie werkt niet

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • honda4life
  • Registratie: Januari 2007
  • Laatst online: 26-09 17:18
Een klein stukje code, dat ik niet werkend krijg (schaam me)
Ik probeer dus een array naar een functie te sturen in borland 4.5 (jaja school, zelf houd ik van modernere software)
Mijn sizeof functie werkt in main maar niet in grafiek(),
met printf kan ik wel elke waarde van gegevens[] printen
ook heb ik al geprobeerd met ipv int gegevens[], int gegevens[10] maar geen resultaat

mijn uitvoer is:
3
1
2
3

2
1
2
3


C:
1
2
3
4
5
6
7
8
9
10
11
main()
{
    int test[3] = {1,2,3};
    printf("%d\n",(sizeof(test)/sizeof(int)));
    printf("%d\n",test[0]);
    printf("%d\n",test[1]);
    printf("%d\n",test[2]);
    printf("\n");
    grafiek(test);
    return 0;
}

C:
1
2
3
4
5
6
7
void grafiek(int gegevens[])
    {
    printf("%d\n",(sizeof(gegevens)/sizeof(int)));
    printf("%d\n",gegevens[0]);
    printf("%d\n",gegevens[1]);
    printf("%d\n",gegevens[2]);
    }

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Probleem is dat je enkel een pointer meegeeft aan de grafiek-functie (een array is eigenlijk een pointer naar het eerste element). Binnen grafiek is dus alleen bekend dat 'gegevens' een pointer is naar een int, maar niet hoeveel ints erna komen. Op mijn systeem zijn pointer en int 32-bits (4 bytes), en sizeof(gegevens) dus ook. Grafiek() print hier dus 4/4=1. Jij zit op 64-bit, omdat er bij jou 2 uitkomt...?

Er zijn verschillende oplossingen mogelijk: een sentinel (speciale waarde zoals -1) gebruiken voor het laatste element (C-strings werken ook zo, een 0-byte geeft het einde van de string aan), het aantal elementen in je array ook meegeven aan grafiek() of iets als std::vector<int> gebruiken (daar kun je .size() van aanroepen) :)

[ Voor 40% gewijzigd door user109731 op 05-12-2008 20:54 ]


Acties:
  • 0 Henk 'm!

  • honda4life
  • Registratie: Januari 2007
  • Laatst online: 26-09 17:18
bedankt, dat staat niet in de boeken van school, misschien kan ik die sizeof wel meegeven met de functie als er echt niks anders op zit

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

JanDM schreef op vrijdag 05 december 2008 @ 20:36:
(een array is eigenlijk een pointer naar het eerste element)
Als parameter wel (of eigenlijk, als parameter wordt een T[] of T[n] geïnterpreteerd als een T*), maar zeggen dat een array eigenlijk een pointer is klopt niet, want typeid(T[]) != typeid(T*) en een array kun je niet herassignen (en sizeof() is ook verschillend, zoals wel bleek uit het voorbeeld). Dit lijkt misschien nitpicking, maar het is belangrijk om te realiseren dat een array niet hetzelfde is als een pointer.
of iets als std::vector<int> gebruiken (daar kun je .size() van aanroepen) :)
Jammer dat ie dan weer C gebruikt ;).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
.oisyn schreef op zaterdag 06 december 2008 @ 01:35:
Als parameter wel (of eigenlijk, als parameter wordt een T[] of T[n] geïnterpreteerd als een T*), maar zeggen dat een array eigenlijk een pointer is klopt niet, want typeid(T[]) != typeid(T*) en een array kun je niet herassignen (en sizeof() is ook verschillend, zoals wel bleek uit het voorbeeld). Dit lijkt misschien nitpicking, maar het is belangrijk om te realiseren dat een array niet hetzelfde is als een pointer.
Ik doelde vooral op het int[] argument van grafiek, maar je hebt gelijk dat het te kort door de bocht is om het zo algemeen te stellen. Ga vooral door met die 'nitpicking', is wel leerzaam :)
Jammer dat ie dan weer C gebruikt ;).
Hm stom, toen ik het tikte meende ik ergens een new[] gezien te hebben, maar nu zie ik dat die er niet staat en alles idd C is :)

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:34
honda4life schreef op vrijdag 05 december 2008 @ 20:41:
bedankt, dat staat niet in de boeken van school, misschien kan ik die sizeof wel meegeven met de functie als er echt niks anders op zit
Een algemeen en zeer veel gebruikte methode is de lengte meegeven aan de functie, kijk maar eens naar de standaard C functies die dat allemaal doen. Voordeel is dat je geen eisen stelt aan de data die erin mag staan zoals met een sentinel waarde wel het geval is.

Ik zou zelfs willen stellen dat dit een betere methode is :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

het meegeven van een (maximum) lengte heeft soms ook intrinsieke veiligheids voordelen (functies die nooit een buffer gebruiken voor meer dan de opgegeven lengte). (buffer overflow etc).

helaas is het niet mogelijk om een array van generieke size te geven aan een C-functie (in C++ heb je std::vectors en templated functies die dat wel kunnen).

mogelijke oplossingen:
- een argument meegeven aan je functie
- je array wrappen in een struct die ook de lengte bijhoud

succes :)

-niks-

Pagina: 1