Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » pointer auf array in einer funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.12.2006, 15:37 Uhr
~clara
Gast


Also, habe eine Frage.

C++:
int* Binar(int zahl,int bit) {
   int b[bit];int *p(0);
   for (int j=bit;j>0;j--)
   b[bit]=int(zahl*pow(2,1-j))%2;
   p=&b[0];
  
   return p;
}
int probe(int array[],int n) {
       for(int i=0;i<n;i++)
       cout<<array[i]<<" ";
      }        



die Funktion Binar umwandelt eine zahl vom dekadsystem ins Binarsystem und speichert sie in einem array.
Sie gibt zuruck einen Pointer auf den Array.
Das Problem:

C++:
probe(Binar(5,3),3);



die Funktion probe, schreibt mir doch nicht diesen array aus, sondern irgendwas wildes.
Kann mir jemand helfen???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.12.2006, 16:07 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Eigentlich sollte sich dein Compiler schon beschweren, weil das
C++:
int b[bit];
nicht geht. Das ist etwas zu dynamisch. Was allerdings geht ist:

C++:
std::vector<int> b(bit);

Ich kenn das Verfahren zwar nicht, aber evtl. brauchst du so etwas:

C++:
std::vector<int> Binar(int zahl,int bit) {
    std::vector<int> b(bit);
    
    for (int j = bit; j > 0; j--)
        b.push_back( (int)(zahl * std::pow((double)2, 1-j)) % 2 );
    
    return b;
}

void probe(std::vector<int> arr,int n) {
       for(int i = 0; i < n; i++)
           std::cout<< arr.at(i)<<" ";
}

Nicht getestet. Fürs logische kann ich wie gesagt nicht garantieren, aber das ist das, was ich aus deinem Quelltext "ausgelsen" hab.
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.12.2006, 16:15 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



C++:
template <class T>
void binaer_ausgeben(T zahl){
    void *x=&zahl;
    for(int i=sizeof(T);--i+1;std::cout<<' ')
        for(int j=8;--j+1;)
            std::cout<<(int)(( *( ((unsigned char*)x)+i )>>j)&1);
    std::cout<<std::endl;
}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.12.2006, 17:09 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Zur veranschaulichung mal die Zwischenschritte, der Code ist schon etwas "Hardcore"

C++:
template <class T>
void binaer_ausgeben(T zahl){
    void *x = &zahl;
    for(int i = sizeof(T); --i+1; std::cout<<' ')
        for(int j = 8; --j+1;)
            std::cout << (int)(( *( ((unsigned char*)x)+i )>>j)&1);
    std::cout << std::endl;
}


Nun zum Aufruf
C++:
template <class T> void binaer_ausgeben(T zahl) // binaer_ausgeben<int>(12);



C++:
void *x = &zahl;
Hier bekommt *x die Adresse von zahl

C++:
for(int i = sizeof(T); --i+1; std::cout<<' ')
Somit hat man bei allen 8 Bit (1Byte) ein Leerzeichen

C++:
for(int j = 8; --j+1;)
Ein Byte == 8 Bit. Das j wird um eins dekrementiert und +1 angegeben, das es nicht nach dem 7tenBuchstaben schon 0 ist.

C++:
std::cout << (int)(( *( ((unsigned char*)x)+i )>>j)&1);
Hier wird erst das x in ein unsigned char gecastet. Dann wird bei jedem Durchlauf --i addiert, angefangen bei 3 in meinem Beispiel(da sizeof(int) == 4 ist). Diese Stelle wird dann dereferenziert und j bits nach rechts geschoben. Angefangen bei 7(--j). An der aktuellen Stelle wird dann die 1 gesetzt und nach int gecastet. Das Ergebniss wird dann ausgegeben.

C++:
std::cout<<std::endl;
Zum Schluß dann noch ein Leerzeichen.
Ich hoffe, das war halbwegs verständlich
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 04.12.2006 um 17:10 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.12.2006, 15:20 Uhr
0xdeadbeef
Gott
(Operator)



C++:
int* Binar(int zahl,int bit) {
   int b[bit];
   // ...
   p=&b[0];
   return p;
}


Das wird so nichts, nicht mal in C99, wo VLAs erlaubt sind. p zeigt auf eine lokale Variable, die nach Ende der Funktion ungültig wird. Jeder zukünftige Zugriff auf den zurückgegebenen Zeiger geht damit ins Nirvana und erzeugt undefiniertes Verhalten. Es gibt zwei Möglichkeiten, hier vorzugehen - erstens, den Buffer von außen weiterreichen, also

C++:
int *binary(int zahl, int *b, int bit) { // wobei b bereits auf einen Speicherbereich der Länge bit zeigt
  // ...

  return b;
}


oder den Kram auf den Heap legen:

C++:
int *binary(int zahl, int bit) {
  int *b = (int*) malloc(sizeof(int) * bit);

  // ...

  return b;
}

// ...

int *bin = binary(20, 8);

// ...

free(bin); // Das hier nicht vergessen, sonst gibts Speicherlecks


In C++ halt statt malloc und free new und delete[] benutzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.12.2006 um 15:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: