Avatar billede codemon Nybegynder
20. marts 2002 - 12:45 Der er 9 kommentarer og
1 løsning

pointer og array problemer

Hvad gør jeg forkert, jeg får hele tiden windoze's alm. meddelelse "ulovlig handling" når jeg prøver at læse i arrayet

// dummy dynamisk liste med arrays
int main()
{
    // hardkodet indsæt i liste
    int value[5] = {10, 20, 30, 40, 50};
    int *inner1[2];
    int *inner2[2];
    list[0] = *inner1;
    list[1] = &value[0];
    inner1[0] = *inner2;
    inner1[1] = &value[1];
    inner2[0] = 0; // slut på liste
    inner2[0] = &value[2];
   
    int *element = *list;
   
    cout << "element[0]: ";
    cout << element[0] << endl;
    *element = element[0];
    cout << "element[0]: ";
    cout << element[0] << endl;
   
}
Avatar billede chries Nybegynder
20. marts 2002 - 13:18 #1
det er fordi koden er fuldstæntig usammen hængende, og meget svært at gennemskue. Hvad er det du prøver at lave ?, det er sikkert lettere at kode noget nyt, end at få det til at hænge sammen for mig:-)

en ting jeg kan påpege er:

int *inner1[2];
int *inner2[2];
   
list[0] = *inner1; her tildeler du list[0] det hvad inner1[0] peger på (kopier addresse for det den peger på ind i list[0])... den peger bare ikke på noget !

inner1[0] = *inner2; får ikke indflydelse på list[0] = *inner1; da det ikke modificerer list[0]'s "værdi".
Avatar billede codemon Nybegynder
20. marts 2002 - 13:26 #2
Jeg forsøger at lave en liste med et array af pointere, størrelsen på arrayet er 2, det ene array-element skal være værdien (pointer til værdien) det andet skal være en pointer til et nyt array af pointere der peger videre osv. (hægtet liste)
Avatar billede chries Nybegynder
20. marts 2002 - 13:54 #3
Så du vil have en liste af hægtede lister ?

list
0 | -> værdi,næste -> værdi,næste -> værdi,næste -> værdi,næste = 0
1 | -> værdi,næste -> værdi,næste -> værdi,næste = 0
2 | -> værdi,næste -> værdi,næste -> værdi,næste -> værdi,næste = 0
...

?
Avatar billede codemon Nybegynder
20. marts 2002 - 17:20 #4
ikke en liste af lister, én liste.

lavede lige hurtigt denne tilsvarende javakode:
hvis det er til nogen hjælp

        Object[] list = new Object[2];
        Object[] inner1 = new Object[2];
        Object[] inner2 = new Object[2];
        Object[] element;
       
        list[0] = new String("list value");
        list[1] = inner1;
        inner1[0] = new String("inner1 value");
        inner1[1] = inner2;
        inner2[0] = new String("inner2 sidste element");
        inner2[1] = null;
       
        element = list;
        System.out.print ("ele[0]: " + element[0]);
        System.out.println ("\tele[1]: " + element[1]);
        System.out.println ("bladre");
        element = (Object[])element[1];
        System.out.print ("ele[0]: " + element[0]);
        System.out.println ("\tele[1]: " + element[1]);
        element = (Object[])element[1];
        System.out.print ("ele[0]: " + element[0]);
        System.out.println ("\nele[1]: " + element[1]);

array[0] = værdi
array[1] = næste array

næstearray[0] = værdi
...
Avatar billede codemon Nybegynder
20. marts 2002 - 17:22 #5
det sidste er en tilføjelse og (s'følig) ikke en del af koden
Avatar billede chries Nybegynder
21. marts 2002 - 09:03 #6
har du overvejet at putte det i en klasse istedet ? eller skal det være via et array ?

class Element
{
public:
    Element( int nValue )
    {
        m_nValue = nValue;   
        m_pNext = 0;
    }

    ~Element()
    {
        // kill next node
        if(    m_pNext )
        {
            delete m_pNext;
        }
    }

    // get next node
    Element* GetNext()
    {
        return m_pNext;
    }

    // insert as last in list
    void SetNext(Element* pElement)
    {
        Element *pNextElement = this;
       
        while( pNextElement->m_pNext != 0 )
        {
            pNextElement = pNextElement->m_pNext;
        }
       
        pNextElement->m_pNext = pElement;
    }

    int m_nValue;

protected:

    Element* m_pNext;
};

// dummy dynamisk liste med arrays
int main()
{
    Element* pList = new Element( 0 );

    for( int i = 1; i<10; i++ )
    {
        pList->SetNext( new Element( i ) );
    }

    int noElement = 0;
    Element* pElement = pList;
    while( pElement != 0 )
    {
        cout << "element " << noElement << ": " << pElement->m_nValue << endl;
        pElement = pElement->GetNext();
        noElement++;
    }

    delete pList;

    return 0;
}
Avatar billede chries Nybegynder
21. marts 2002 - 09:04 #7
okey min SetNext skulle måske havde heddet AddAsLastInChain eller sådan noget =)
Avatar billede codemon Nybegynder
21. marts 2002 - 21:56 #8
Det skal være via et array, det er bare for at afprøve den ide. Din klasse er ok, men det er en alm. selvreferende klasse til hægtede lister.

Problemet er vel der hvor der i javakoden laves en cast fra Object til Object[], fordi der bruges polymorfi til at hægte arrays og objekter på samme type reference (2 arrayelementer har jo samme type)

Jeg er kun lige begyndt med C++ og derfor kørt lidt fast med den pointeropgave.

Hvordan løses det med at have en pointer til selv at pege på en pointer (og forskellige til forskellige tidspunkter)?
Avatar billede chries Nybegynder
22. marts 2002 - 09:34 #9
har har noget der virker her :-) men kan bedre lide min klasse løsning.

// TestMe.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"


// dummy dynamisk liste med arrays
int main()
{
  // hardkodet indsæt i liste
    int value[5] = {10, 20, 30, 40, 50};
   
    int *list[2];
    int *inner1[2];
    int *inner2[2];

    list[0] = value+0;
    list[1] = reinterpret_cast<int*>(inner1);

    inner1[0] = value+1;
    inner1[1] = reinterpret_cast<int*>(inner2);

    inner2[0] = value+2;
    inner2[1] = 0; // slut på liste


   
    int elementno = 0;

    int **element = reinterpret_cast<int**>(list);
    cout << "element[" << elementno++ << "] = " << *element[0] << endl;

    do
    {
        element = reinterpret_cast<int**>(element[1]);
        cout << "element[" << elementno++ << "] = " << *element[0] << endl;
    } while( element[1] != 0 ); 

    return 0;
}
Avatar billede codemon Nybegynder
22. marts 2002 - 11:54 #10
fedt. Takker mange gange
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