| TCH (statz) | ![]() #1, Főfasz (10579) |
1816 | #42a9 | ^ | Idézet | Mon, 10 Apr 2017 23:23:48 +02 |
| 94.21.*.* |
|
*.pool.digikabel.hu |
| Tehát akkor általános C gyökérség és nem winfos specifikus, értem. Csak azért, mert semmi értelme, simán lehet tudni a méretet előre is. Ha char*, akkor strlen(), ha meg struct, akkor meg sizeof(). Ami meg a pre-alloc-ot illeti, ezek szerint ez a GetAdaptersInfo(info, &size); úgy működik, hogy ha az info == NULL, akkor csak a méretet adja vissza, ha meg nem, akkor meg oda tölti. Hát ezt meg lehet csinálni úgy is, hogy lenne egy GetAdaptersSize() függvény, meg lenne a GetAdaptersInfo(). De kettébontani is felesleges: mégis mi gátolta meg a GetAdaptersInfo() íróját abban, hogy belül foglaljon memóriát? Akkorát amekkorát kell? // mittudomen hogy mukodik, ez most ilyen pseudo-example
void GetAdaptersInfo(IP_ADAPTER_INFO **info, DWORD *size)
{
*size = GetAdaptersCount() * sizeof(struct _IP_ADAPTER_INFO);
*info = malloc(size);
PutAdapters(*info);
}Azaz tudjuk hány darab ilyen struct van, lefoglalunk pont akkora memóriát és oda írjuk őket. Vissza meg egy (struct **) jön, így lehet megoldani a pointerlistákat.Ehhez képest ez kb. most így nézhet ki belül: void GetAdaptersInfo(IP_ADAPTER_INFO *info, DWORD *size)
{
if (info == NULL)
{
*size = GetAdaptersCount() * sizeof(struct _IP_ADAPTER_INFO);
}
else
{
PutAdapters(info);
}
}Gondolom belátható, hogy ennek semmi értelme. Akkor is, ha a mikrofos bűne, akkor is, ha bad C practice.De, hogy adjak másik példát, itt a tied, átírva egylépcsősre: char *nev = "Gipsz Jakab";
int kor = 43;
int kl = 1;
int kor2 = kor / 10;
while (kor2 > 0)
{
++kl;
kor2 /= 10;
}
int meret = kl + strlen(nev) + 15;
char szoveg[meret+1];
snprintf(szoveg, meret+1, "Név: %s Életkor: %d", nev, kor); |