Schrift
[thread]1121[/thread]

Länge eines arrays: länge in Bytes oder Anzahl der Elemente



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
format_c
 2005-03-13 21:03
#11096 #11096
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hi,
ist vielleicht eine etwas rudimentäre Frage aber ich stehe gerade erst in den Anfängerschuhen was C++ angeht. Ich suche einen Befehl oder Funktion die mir entweder die Länge eines Arrays in Bytes zurückgibt oder die Anzahl der elemente. Kann mir jemand helfen??

gruß Alex
betterworld
 2005-03-13 22:13
#11097 #11097
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Versuch mal sizeof(). Das ist aber etwas, was zur Kompilierzeit gemacht wird, je nach Deklaration der Arrays. Zur Laufzeit geht es natuerlich nicht, weil Arrays dynamisch sein koennen.
format_c
 2005-03-13 22:42
#11098 #11098
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hey stimmt. Hab zwar schon mit sizeof rumgespielt aber irgendwie war ich da zu blind
danke
Gruß alex
format_c
 2005-03-13 22:57
#11099 #11099
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich weis das hier ist ein Perl forum aber ihr seit einfach zu schnell :-I)
wie kann ich denn während der Laufzeit Weitere elemente für das array frei machen??. Also weiter hinaus gehen als das array deklariert wurde??

Gruß Alex
betterworld
 2005-03-13 23:03
#11100 #11100
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
man realloc
oder was suchst du ;)
format_c
 2005-03-13 23:26
#11101 #11101
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wie verwendet man das richtig. Ich tue mich immer noch etwas schwer die Hilfen zu C zu interpretieren. Mein bisheriger Veruch sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
format_c@manchester:~> cat test.c && g++ test.c -otest && ./test && rm test
#include <stdio.h>
#include <stdlib.h>

int main () {
int array[2] = {1,2};
printf("Aktuelle Groesse: %d\n",sizeof(array));
realloc(*&array,sizeof(int));
printf("Aktuelle Groesse: %d\n",sizeof(array));
return 0;
}

Aktuelle Groesse: 8
Segmentation fault
format_c@manchester:~>

Ich möchte jetzt das Array um ein element vergrößern.

Gruß Akex
esskar
 2005-03-13 23:52
#11102 #11102
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
nö...
das geht so nicht.
du hast 2 möglichkeiten.
1. schreib dir ne Array Klasse
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Array {
  public:
     Array(int def = 0) {
        m_array = NULL;
        m_def = def;
        m_size = m_length = 0;
     }
     ~Array() {
        Free();
     }

     void Free() {
        if(m_array != NULL) {
            free(m_array);
            m_array = NULL;
        }
        m_size = m_length = 0;
     }

     unsigned int Length() const {
        return m_length;
     }

     unsigned int Size() const {
        return m_size;
     }

     void Push(int e) {
         if(m_length == m_size) {
            unsigned int size = m_size ? m_size * 2 : 8;
            if(m_array == NULL) {
               m_array = (int *)malloc(size);
               memset(m_array, m_def, size);
            } else {
               m_array = (int *)realloc(m_array, size);
               memset(m_array+m_size, m_def, size-m_size);
            }
            m_size = size;
         }
         m_array[m_length++] = e;          
     }

     int At(undigned int idx) const {
        if(idx < m_size) return m_array[idx];
        else return m_def;
     }

 protected:
    int m_def;
    unsigned int m_size, m_length;
    int *m_array;
};


int main(int argc, char *argv[]) {
  Array a;
  a.Push(1);
  a.Push(2);
  a.Push(6);
  for(unsigned int i = 0; i < a.Length(); i++)
     printf("%i: %i\n", i, a.At(i));
  return 0;
}


oder benutz die STL
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#include <vector>

int main(int argc, char *argv[]) {
  vector<int> a;
  a.push_back(1);
  a.push_back(2);
  a.push_back(6);
  for(unsigned int i = 0; i < a.size(); i++)
     printf("%i: %i\n", i, a.at(i));
  return 0;
}
\n\n

<!--EDIT|esskar|1110750855-->
format_c
 2005-03-14 10:27
#11103 #11103
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich glaube ich nehm dann wohl eher die StL

Ich probier mich mal.

PS Wenn man Perl gewöhnt ist, ist C++ echt undankbar.

Gruß Alex
format_c
 2005-03-14 10:54
#11104 #11104
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Muss dazu noch ne Libary linken?? z:B. wie bei cuses.h
Code: (dl )
g++ datei.cpp -lncurses


???
Ich bekomme folgenden Error Output:
Code: (dl )
1
2
3
4
5
6
7
$> g++ test.c -lvector
test.c: In function `int main(int, char**)':
test.c:6: error: `vector' undeclared (first use this function)
test.c:6: error: (Each undeclared identifier is reported only once for each
function it appears in.)
test.c:6: error: parse error before `>' token
test.c:7: error: `a' undeclared (first use this function)

Gruß Alex
esskar
 2005-03-14 15:29
#11105 #11105
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
sorry; mein fehler:
du musst
Code: (dl )
std::vector<int> a;
schreiben.
und nen die datei noch .cpp anstatt .c (ist unter linux glaube ich egal, aber es ist eindeutig c++ was du programmierst und nicht c)
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-03-13 21:03.