![]() |
Arrays gezielt über Grenzen hinaus beschreiben
Hallöchen!
Hat jemand von euch eine Idee, wie man ein Array gezielt über das erste Element hinaus beschreiben kann? Damit meine ich, dass folgender Code
Code:
das 3FE (hex) Ergebnis liefert.
unsigned char hallo[8],i,stelle=0,a=0;
for(i=0;i<8;i++)hallo[i]=0; for(i=0;i<10;i++){ *hallo |= (a<<stelle++); a=1; } printf("hallo= %x%x\n",hallo[1],hallo[0]); Ich habe das ganze vorerst so gelöst:
Code:
Da es in diesem Programm um jede Millisekunde geht (und das ganze sehr oft aufgerufen wird), würde ich mich über eine bessere Lösung freuen :zwinker:
unsigned char hallo[8],i,stelle=0,a=0;
for(i=0;i<8;i++)hallo[i]=0; for(i=0;i<10;i++){ if (stelle<8) hallo[0] |= (a<<stelle++); else if(stelle<16) hallo[1] |= (a<<(stelle++ -8)); a=1; } printf("hallo= %x%x\n",hallo[1],hallo[0]); :dp: Gruß, Elko |
Re: Arrays gezielt über Grenzen hinaus beschreiben
Warum willst du das tun?
|
Re: Arrays gezielt über Grenzen hinaus beschreiben
Ohne die Pointersemantik von C genau zu kennen, aber statt "*hallo" vielleicht "(long)(*hallo[0])*"?
|
Re: Arrays gezielt über Grenzen hinaus beschreiben
Zitat:
@Dax: Was meinst du denn? Ein kleiner Hinweis noch dazu, was schiefläuft: Das erste Byte bekommt wie erwartet den Wert FE. Das zweite BYte, das ja eigentlich "3" enthalten müsste, ist aber immer noch "0"... Gruß, Elko |
Re: Arrays gezielt über Grenzen hinaus beschreiben
Code:
Das meine ich ;) Aber wie gesagt, die Pointersemantik von C ist mir nicht ganz geläufig... Wenn du allerdings (bur) n 1-Bits und ein 0-Bits willst, wäre (1 << (n + 1)) ^ 1 vielleicht die bessere Alternative.
unsigned char hallo[8],i,stelle=0,a=0;
for(i=0;i<8;i++)hallo[i]=0; for(i=0;i<10;i++){ ((long*)(*hallo[0]))* |= (a<<stelle++); a=1; } printf("hallo= %x%x\n",hallo[1],hallo[0]); |
Re: Arrays gezielt über Grenzen hinaus beschreiben
Vor das hallo[0] muss ein &, kein *, schließlich willst du die Adresse nehmen. Und zu deinem anderen Vorschlag, Dax: Müsste das nicht minus Eins statt xor Eins sein?
|
Re: Arrays gezielt über Grenzen hinaus beschreiben
Oke, dann ein & - mir ist es wie gesagt selbst nicht ganz klar :)
Zitat:
|
Re: Arrays gezielt über Grenzen hinaus beschreiben
Ahh, das ist schon mal ein guter Anfang:
Code:
So klappts ;-) Das Problem ist nur, dass ich nur beispielhaft lauter Einsen und eine Null reingeschoben habe und das mit den 10 Bits auch nur ein Test sein sollte. Insgesamt müssen es nämlich 64 Bit sein. Aber dafür gibt es ja m.E. keinen Datentyp...
unsigned char hallo[8],i,stelle=0,a=0;
for(i=0;i<8;i++)hallo[i]=0; for(i=0;i<64;i++){ *((long*)(&hallo[0])) |= (a<<stelle++); a=1; } printf("hallo= %x%x\n",hallo[1],hallo[0]); Habt ihr noch eine Idee? Gruß, Elko |
Re: Arrays gezielt über Grenzen hinaus beschreiben
Das habe ich irgendwann mal gemacht. *g*
Code:
Sollte so funktionieren (denke ich)...
static void setBit(long* arr, int bit) {
arr[bit >> (sizeof(long) * 8)] |= 1 << (bit & (sizeof(long) * 8 - 1); } static int getBit(long* arr, int bit) { return (arr[bit >> (sizeof(long) * 8] >> (bit & (sizeof(long) * 8 - 1)) & 1; } |
Re: Arrays gezielt über Grenzen hinaus beschreiben
Zitat:
Include am besten einmal stdint.h ;) gehört afaik auch zum C-Standard. Im übrigen müsstest du "einfach" nur hallo[stelle>>3] |= (a << (stelle++)%8) zuweisen, wenn ich dein Problem richtig verstanden habe. Ersterer Teil greift auf das Element "stelle mod 8" zu, zweiterer schiebt das Bit dann zum Rest. mfG Markus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz