Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Variable zur laufzeit

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 ] [ 2 ] > 3 < [ 4 ] [ 5 ] [ 6 ] [ 7 ]
020
10.08.2003, 00:16 Uhr
~Anfänger00
Gast



C++:
#include <iostream.h>
#include <stdlib.h>
int main()
{
int **my_2d_array,x,y;
cout<<"Bitte y dimension eingeben:";
cin>>y;
cout<<"Bitte x dimension eingeben:";
cin>>x;

my_2d_array = new int*[y];

for(int i=0;i<y;i++)
{
my_2d_array[y] = new int [x];
for(int j=0;j<x;j++)
{      
         my_2d_array[i][j]= rand();
     cout<<my_2d_array[i][j]<<"\n";
}
}
delete[] my_2d_array;
getchar();
}



soo,ich hoffe ich hab keine fehler gemacht,allerding stürzt das Programm
nach ein paar augegebenen Zahlen ab.
Ich hoffe ich hab deine Aufgabenstellung richtig verstanden
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
10.08.2003, 00:49 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


sieht ganz gut aus
ein paar anmerkungen haben noch
nimm keine alten header machs so


C++:
#include <iostream>
using namespace std;



dein fehlerchen war hier

C++:
my_2d_array[y] = new int [x]; //falsch
my_2d_array[i] = new int [x]; //hier muss ein i hin sonst allokiert der jedesmal für das 2d_array an der stelle y neuen speicher



zum schluss gibst du nicht richtig frei
bevor du den "hauptpointer freigeben darft erst die unterarrays
also so:


C++:
for(i=0;i<y;i++) delete [] my_2d_array[i];
delete[] my_2d_array;



für jemanden der glaubt das gar nciht verstanden zu habe war das doch schon ganz ordentlich

so hier noch mal das proggie komplett

C++:
#include <iostream>
using namespace std;

int main(){
int **my_2d_array,x,y,i,j;

cout<<"Bitte y dimension eingeben:";
cin>>y;
cout<<"Bitte x dimension eingeben:";
cin>>x;

my_2d_array = new int*[y];

for(i=0;i<y;i++){
    my_2d_array[i] = new int [x];
    for(j=0;j<x;j++){      
        my_2d_array[i][j]= rand();
        cout<<my_2d_array[i][j]<<"\t";
    }
        cout<<endl;
}

for(i=0;i<y;i++) delete [] my_2d_array[i];
delete[] my_2d_array;
getchar();
}




Ich persönlich benutze aus dem grund das ich ständig die schleife(n) zum freigeben des speichers bei mehrdimensionalen arrays mitschleppen muss nur eindimensionale arrays. Handycap hierbei ist das man "kompliziertere" Indexrechnungen machen muss

das geht dann so:


C++:
#include <iostream>
using namespace std;

int main(){
int *my_2d_array,x,y,i,j;

cout<<"Bitte y dimension eingeben:";
cin>>y;
cout<<"Bitte x dimension eingeben:";
cin>>x;

my_2d_array = new int[x*y];

for(i=0;i<y;i++){
    for(j=0;j<x;j++){      
        my_2d_array[i*x+j]= rand();
        cout<<my_2d_array[i*x+j]<<"\t";
    }
        cout<<endl;
}
delete[] my_2d_array;
getchar();
}



ist aber sicherlich ne geschmackfrage aber man kann auch locker komplett ohne mehrdimensionale arrays auskommen indem man das kommplett auf ein eindimensionales array abbildet. (Im speicher legt es der rechner eigentlich auch nicht anders ab, mal davon abgesehen das das nicht hintereinander im speicher liegen musst wenn du nicht alles auf einmal allokierst)


Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.08.2003 um 00:52 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
10.08.2003, 01:08 Uhr
~Marzel
Gast


gibt das programm nicht automatisch beim beenden den speicher für das array wieder frei?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
10.08.2003, 01:25 Uhr
~Anfänger00
Gast



C++:
#include <iostream.h>
#include <stdlib.h>
int main()
{
int **my_2d_array,x,y;
cout<<"Bitte y dimension eingeben:";
cin>>y;
cout<<"Bitte x dimension eingeben:";
cin>>x;

my_2d_array = new int*[y];

for(int i=0;i<y;i++)
{
my_2d_array[i] = new int [x];
for(int j=0;j<x;j++)
{      
         my_2d_array[i][j]= rand();
     cout<<my_2d_array[i][j]<<"\t";
     delete[] my_2d_array[i];
}
}
delete[] my_2d_array;
getchar();
}



Noch besser:wenn man bei y 1000 und bei x 1000 eingibt werden 5k an Speicher verschwendet,und das wollen wir ja nicht
Lösung: Speicher freigeben wenn nicht mehr gebraucht so werden nur 1024byte gebraucht. (davon hab ich mich taskmanager von win xp überzeugen lassen )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
10.08.2003, 01:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


jupp ist klar, wenn du ihn gleich wieder freigibst.
Ist dann allerdings auch nciht mehr sinnvoll mit einem 2d_Array_zu arbeiten.

das torpediert eher die aufgabenstellung, (das geht ja nur weil du den ihnalt sofort ausgibst. Wenn du es so machen willst kannst du es auch gleich ganz ohne array machen)


C++:
include <iostream.h>
#include <stdlib.h>
int main(){
int x,y;
cout<<"Bitte y dimension eingeben:";
cin>>y;
cout<<"Bitte x dimension eingeben:";
cin>>x;

for(int i=0;i<y;i++){
    for(int j=0;j<x;j++)
      cout<<rand()<<"\t";
    cout<<endl;
}
}



zeigt aber das du es anscheinend wirklich begriffen hast.

so ich geh jetzt pennen bis morgen

Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.08.2003 um 01:33 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
10.08.2003, 01:36 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Marzel

das macht aber nur das betriebssystem (und auch nur wenn du glück hast, jetzt nicht wieder alle auf windoof rumhacken) für dich weil es sich merkt was der prozess belegt hast.

Normalerweise läuft dein Programm ja in so ner arte endlosschleife (menu)
wenn du da ständig neuen speicher allokierst ohne den wieder freizugeben dann ist der irgendwann mal dicht

also niemals den fehler machen und vergessen den speicher wieder freizugeben das kann unangenehme folgen haben.

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
10.08.2003, 07:45 Uhr
~Anfänger00
Gast


Stimmt,daran hab ich garnicht gedacht,aber ich ja kein profi der sofort weiß was unötig ist.Man müßte das Programm dann ausbauen damit es sich rentiert.. für die Aufgabe und für die Antworten auch noch um 1:36Uhr
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
10.08.2003, 09:11 Uhr
~Anfänger00
Gast


Da wär noch was:

C++:
delete[] my_2d_array[ i ]; //woher weiß das Programm,dass es genau
                                    //my_2d_array[i][j] löschen soll?
                                    //und nicht ein gesamtes array[i]

delete[] my_2d_array; //was wird hier eigentlich konkret gelöscht
/* wieso muss man hier vorher delete[] my_2d_array[ i ];
     schreiben,warum wird dort nicht das ganze gelöscht? */


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
10.08.2003, 10:48 Uhr
Marzel



@ Heiko
...muss man aber doch nur freigeben wenn der Speicher dynamisch allokiert wurde, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
10.08.2003, 11:11 Uhr
Oliver
S2-Pixelgeneral


@Marzel: ja

@Anfänger00:

bei deinem zweidemensionalen Array wurden beide Deimensionen dynamisch erzeugt und deswegen müssen Sie auch beide wieder gelöscht werden:

alles was dynamisch allokiert wird, muss prinzipiell auch wieder freigegeben werden.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ] [ 6 ] [ 7 ]     [ 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: