Avatar billede gufledk Nybegynder
16. november 2003 - 19:44 Der er 16 kommentarer og
2 løsninger

Array 2 dimmentionelt med variabel størrelse

dav...
Til at starte med ved jeg godt der er en del om det spørgsmål som jeg vil stille... men da jeg stadig er lidt af en nybegynder til c++ forstår jeg ikke det hele...

Problemmet er at jeg og en klassekammerat er igang med en opgave (går stadig i skole) der skal lave en tipskupon vi har fået den lavet og den spytter også kuponerne pænt ud... men jeg kan ikke selv bestemme hvor mange rækker den skal lave..

Vi skal have definere vores array tal[q][ 7 ] til et program der udskriver lottotalrækker...
q har vi sat til en værdi af maks rækker, f.eks 100 rækker... men hvad hvis man vil have 110 rækker? derfor ville det være bedre med en variabel der indtastes i starten!!!...
Denne variabel får vi via en argument (q)som allerede er lavet...

Håber der er nogen der kan hjælpe os....

MVH Gufle
Avatar billede arne_v Ekspert
16. november 2003 - 19:55 #1
Jeg lavede engang følgende lille eksempel af mulighederne:

#include <iostream>

using namespace std;

void init1(int *a,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) a[i*m+j]=1;
  return;
}

void show1(int *a,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << a[i*m+j];
      cout << endl;
  }
  return;
}

void init2(int **b,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) b[i][j]=2;
  return;
}

void show2(int **b,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << b[i][j];
      cout << endl;
  }
  return;
}

typedef int twodim[][3]; // <-------- fixed second dimension

void init3(twodim c,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) c[i][j]=3;
  return;
}

void show3(twodim c,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << c[i][j];
      cout << endl;
  }
  return;
}

int main()
{
  int n = 2;
  int m = 3;
  int *a = new int[n*m];
  init1(a,n,m);
  show1(a,n,m);
  int **b = new (int *)[n];
  for(int i=0; i<n; i++) b[i]=new int[m];
  init2(b,n,m);
  show2(b,n,m);
  twodim *c = new twodim[2];
  init3(*c,n,m);
  show3(*c,n,m);
}

Brug metode 1 eller 2. Nummer 3 virker vist ikke i alle compilere.

1=en dimensionelt array hvor man selv udregne rindex
2=array af arrays
Avatar billede squashguy Nybegynder
16. november 2003 - 20:27 #2
kan man ikke bare gøre sådan:

int q = 120;

typedef int _p[7];
_p *p;
p = new _p[q];

tildeling af værdier
p[q][i] = x;
Avatar billede gufledk Nybegynder
16. november 2003 - 20:32 #3
Arne..... jeg har forsøgt dit forslag.... men kunne ikke få det til at virke...
Avatar billede arne_v Ekspert
16. november 2003 - 20:33 #4
Jo, når den ene dimension er fixed, så er det nok lidt nemmere.
Avatar billede arne_v Ekspert
16. november 2003 - 20:34 #5
Hvilken fejl får du på hvilken kode ?
Avatar billede gufledk Nybegynder
16. november 2003 - 20:53 #6
jeg bruger borland 5.02...

jeg får følgende feljmeldinger...


DOCUMENTS\MODTAGNE FILER\noname00.cpp
Error:  noname00.cpp(59,28):Cannot convert 'int *' to 'int * *'
Error:  noname00.cpp(63,29):Size of the type 'int[][3]' is unknown or zero
Avatar billede arne_v Ekspert
16. november 2003 - 20:56 #7
Hvis det er min kode du forsøger at compile uændret så slet:

typedef int twodim[][3]; // <-------- fixed second dimension

void init3(twodim c,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) c[i][j]=3;
  return;
}

void show3(twodim c,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << c[i][j];
      cout << endl;
  }
  return;
}

og:

  twodim *c = new twodim[2];
  init3(*c,n,m);
  show3(*c,n,m);

(som jeg også skrev er nummer 3 ikke standard C++)
Avatar billede gufledk Nybegynder
16. november 2003 - 20:57 #8
oki.. prøver det lige
Avatar billede ferrari_brian Nybegynder
16. november 2003 - 21:02 #9
hej... jeg laver dette program sammen med gufledk ... men jeg har arbejdet lidt i:

int *p;
p = new int (a);

...

delete p;

men det kan vel ikek virke på 2-dimensionelle ?
Avatar billede arne_v Ekspert
16. november 2003 - 21:08 #10
Nej.

Se min eksempel kode på mulighederne.

Kig evt. lidt på squashguys forslag. Hvis det løser problemet er det jo
nemt !
Avatar billede ferrari_brian Nybegynder
16. november 2003 - 21:35 #11
#include <iostream>
#include <conio.h>
#include <stdlib.h>

void main()
{
int q;
cin >> q;



typedef int _p[7];
_p *p;
p = new _p[q];

//tildeling af værdier
    for(int a = 0; a < q; ++a)
    {
        for(int i = 0; i < 7; ++i)
        {

            p[a][i] = rand() % 36 + 1;



        }
    }


    for(int b = 0; b < q; ++b)
    {
        cout << "\n";
        for(int t = 0; t<7; ++t)
        {
            cout << p[b][t] << ' ';
        }
  }
    getch();

  }

// det her virker... meeen vi kan  ikke få det til at virke som et globalt array som vi kan bruge i vores funktioner... nogen forslag?
Avatar billede arne_v Ekspert
16. november 2003 - 21:36 #12
Det er vel bare at flytte:

typedef int _p[7];
_p *p;

op som global variabel.
Avatar billede ferrari_brian Nybegynder
16. november 2003 - 21:39 #13
hmm...
skal lige prøves
Avatar billede gufledk Nybegynder
16. november 2003 - 21:49 #14
nu virker det...jeg sender 40 point til squasbguy, der kom med den egentlige løsning og 20 point til arne_v der kom med løsningen til den globale del...

vi kan ikke have at I går tomhændet hjem... :-)
Avatar billede gufledk Nybegynder
16. november 2003 - 21:49 #15
MANGE TAK!!!!!
Avatar billede squashguy Nybegynder
16. november 2003 - 21:51 #16
helt i orden :)
Avatar billede gufledk Nybegynder
16. november 2003 - 21:51 #17
squahguy... du skal lige smide et svar.... hvis du vil have dine points.... ;-)
Avatar billede ferrari_brian Nybegynder
16. november 2003 - 21:51 #18
Jeg siger også tak :-D

så må vi jo bare vente på squasbguy :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester