AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Arrays gezielt über Grenzen hinaus beschreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Arrays gezielt über Grenzen hinaus beschreiben

Ein Thema von Elko · begonnen am 2. Okt 2008 · letzter Beitrag vom 2. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2      
Elko

Registriert seit: 2. Feb 2008
52 Beiträge
 
Delphi 7 Personal
 
#1

Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 19:13
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:
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]);
das 3FE (hex) Ergebnis liefert.

Ich habe das ganze vorerst so gelöst:
Code:
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]);
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

Gruß,
Elko
Keyboard not found. Press any key to continue.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 19:21
Warum willst du das tun?
Markus Kinzler
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#3

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 20:26
Ohne die Pointersemantik von C genau zu kennen, aber statt "*hallo" vielleicht "(long)(*hallo[0])*"?
  Mit Zitat antworten Zitat
Elko

Registriert seit: 2. Feb 2008
52 Beiträge
 
Delphi 7 Personal
 
#4

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 20:56
Zitat von mkinzler:
Warum willst du das tun?
Weil ich eine 64-Bit lange Zahl aus einzelnen Bits zusammensetzen muss und es dafür keinen Datentyp gibt. Daher hab ich ein Array aus 8 BYtes erstellt, was ja 64 Bit entspricht. Die Frage ist jetzt nur noch, wie ich diese "Zahl" aus einzelnen Bits zusammensetzen kann.

@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
Keyboard not found. Press any key to continue.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 21:09
Code:
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]);
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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 21:11
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?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#7

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 21:16
Oke, dann ein & - mir ist es wie gesagt selbst nicht ganz klar


Zitat von Apollonius:
Müsste das nicht minus Eins statt xor Eins sein?
Nein. 3 1en und eine 0 ist 1110 - (1 << (n + 1)) - 1 ist 1000 - 1 = 111, mit ^ 1 dagegen sind es die gewünschten 1110.
  Mit Zitat antworten Zitat
Elko

Registriert seit: 2. Feb 2008
52 Beiträge
 
Delphi 7 Personal
 
#8

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 21:19
Ahh, das ist schon mal ein guter Anfang:
Code:
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]);
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...
Habt ihr noch eine Idee?

Gruß,
Elko
Keyboard not found. Press any key to continue.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#9

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 21:25
Das habe ich irgendwann mal gemacht. *g*
Code:
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;
}
Sollte so funktionieren (denke ich)...
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#10

Re: Arrays gezielt über Grenzen hinaus beschreiben

  Alt 2. Okt 2008, 21:28
Zitat von Elko:
Zitat von mkinzler:
Warum willst du das tun?
Weil ich eine 64-Bit lange Zahl aus einzelnen Bits zusammensetzen muss und es dafür keinen Datentyp gibt. Daher hab ich ein Array aus 8 BYtes erstellt, was ja 64 Bit entspricht. Die Frage ist jetzt nur noch, wie ich diese "Zahl" aus einzelnen Bits zusammensetzen kann.

@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
Kennst du int64_t und uint64_t, oder auch bekannt als long long und unsigned long long?
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
Markus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz