Schrift
[thread]1143[/thread]

C++ Prüfen ob Variable definiert?

Leser: 1


<< >> 10 Einträge, 1 Seite
BratHering
 2006-05-25 19:46
#11367 #11367
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Hallo,

keine Ahnung ob das eine doofe Frage ist aber ich nutze Perl schon einfach zu lange und das wirkt sich auf meine C++ Kenntnisse negaitiv aus. ;)

Kann man in einem C++ Programm zur Laufzeit prüfen, ob eine Variable definiert oder undef ist?


Mir schwebt da folgedes vor:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
int main(void)
{
int array[10] = {1,2,3,4,5,6,7,8,9,0};
int n = 0;

while (array[n])
{
std::cout << array[n] << std::endl;
n++;
}

return 0;
}


Die Schleife im oberen Code bricht bei array[0] ab, weil die 0 dem false entspricht.


Um dieses Verhalten zu umgehen benutze ich in Perl folgendes:

Code: (dl )
1
2
3
4
5
6
7
8
@array = (1,2,3,4,5,6,7,8,9,0)
$n = 0;

while(defined($array[$n]))
{
print "$array[$n]\n";
$n++;
}



Also mir geht es jetzt erstmal darum, ob es in C++ eine Art defined() Funktion in gibt, mit der man zur Laufzeit prüfen kann ob eine Variable definiert ist?



MfG
Brathering :)
renee
 2006-05-26 00:02
#11368 #11368
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn ich mich nicht irre, müsste es so etwas wie Variable == NULL geben...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2006-05-26 00:22
#11369 #11369
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=renee,25.05.2006, 22:02]Wenn ich mich nicht irre, müsste es so etwas wie Variable == NULL geben...[/quote]
Fuer Pointer, aber nicht fuer Array-Elemente
Thorium
 2006-05-26 00:39
#11370 #11370
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das darfst du sowieso nicht so machen...
Wenn du auf eine Variable zugreiffst, die nicht definiert ist gibts meiner Meinung nach nen klassischen Speicherzugriffsfehler...
Beziehungsweise kannst du nicht davon ausgehn, dass der Inhalt leer ist - der Inhalt kann irgendwas sein, je nach dem was im Speicher gerade steht...
Besser ist festzustellen wie viele Elemente in array sind und dann mit einer for schleife alle durchgehn...\n\n

<!--EDIT|Thorium|1148589665-->
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
BratHering
 2006-05-26 00:41
#11371 #11371
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Ich habe es versucht mit == NULL zu vergleichen, aber die daraus resultierende Warnung besagt: [Warning] NULL used in arithmetic
Und ausserdem funktioniert es dann auch nicht so wie ich es mir denken würde.
Dubu
 2006-05-26 03:23
#11372 #11372
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ein "defined" kann es bei Arrays in C/C++ nicht geben, da es keine Metainformationen zu Arrays gibt. Es werden vom Compiler nur ein passender Speicherbereich und ein Pointer darauf reserviert (oder dafür gesorgt, dass sie im laufenden Programm reserviert werden). Was in diesem Speicherbereich enthalten ist, wird komplett dem Programmierer überlassen.

Bei Arrays in C/C++/Java muss man sich einfach merken, wie groß sie sind. Üblich ist bei statischen Arrays die Verwendung von Konstanten.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#define ARRAYLEN    10

int main(void)
{
   int array[ARRAYLEN] = {1,2,3,4,5,6,7,8,9,0};
   int n = 0;
   
   while (n < ARRAYLEN)
   {
         std::cout << array[n] << std::endl;
         n++;
   }
   
   return 0;
}


Für ein komfortableres Verhalten bietet die C++-Stdlib Container wie vector oder list und Iteratoren für den Zugriff darauf.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>

using namespace std;

int main ()
{
   vector<int> array(10);
   vector<int>::iterator array_iter = array.begin();

   // 1 bis 10 zuweisen
   for (int i=1; array_iter != array.end(); ++i) {
       *array_iter++ = i;
   }
   // einfach Zuweisung an letztes Element
   array[array.size()-1] = 0;

// Array ausgeben
   array_iter = array.begin();
   while (array_iter != array.end()) {
       cout << *array_iter << " ";
       ++array_iter;
   }
   cout << endl;

   return 0;
}
renee
 2006-05-26 10:25
#11373 #11373
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bei Java muss man es sich nicht "merken", denn da gibt es das Attribut length für das Array...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
BratHering
 2006-05-26 15:03
#11374 #11374
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Nun gut, dann bin ich erstmal aufgeklärt. :D
Vielen Dank!
esskar
 2006-05-26 15:04
#11375 #11375
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
vorschlag

Code: (dl )
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main(void)
{
int array[10] = {1,2,3,4,5,6,7,8,9,0};

for(int i = 0; i < sizeof(array) / sizeof(int); i++)
std::cout << array[i] << std::endl;

return 0;
}
Dubu
 2006-05-26 16:57
#11376 #11376
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=renee,26.05.2006, 08:25]Bei Java muss man es sich nicht "merken", denn da gibt es das Attribut length für das Array...[/quote]
Stimmt, mein Fehler. In Java sind Arrays schon Objekte, anders als in C++.
<< >> 10 Einträge, 1 Seite



View all threads created 2006-05-25 19:46.