C++ Fout: ongeldige typen ‘int [int]’ voor array subscript

Probeer C++ te leren en te werken door een eenvoudige oefening op arrays.

In principe heb ik een multidimensionale array gemaakt en ik wil een functie maken die de waarden afdrukt.

De gereageerde voor-lus binnen main () werkt prima, maar wanneer ik probeer dat voor-lus in een functie te veranderen, werkt het niet en voor het leven van mij, ik kan niet zien waarom.

#include <iostream>
using namespace std;
void printArray(int theArray[], int numberOfRows, int numberOfColumns);
int main()
{
    int sally[2][3] = {{2,3,4},{8,9,10}};
    printArray(sally,2,3);
//    for(int rows = 0; rows < 2; rows++){
//        for(int columns = 0; columns < 3; columns++){
//            cout << sally[rows][columns] << " ";
//        }
//        cout << endl;
//    }
}
void printArray(int theArray[], int numberOfRows, int numberOfColumns){
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x][y] << " ";
        }
        cout << endl;
    }
}

Antwoord 1, Autoriteit 100%

C++ erft zijn syntaxis van C, en probeert hard om achterwaartse compatibiliteit te handhaven waar de syntaxis overeenkomt. Dus passerende arrays werkt net als C: de lengte-informatie is verloren.

C++ biedt echter een manier om de lengte-informatie automatisch door te geven, met behulp van een referentie (geen achterwaartse compatibiliteitsproblemen, C heeft geen referenties):

template<int numberOfRows, int numberOfColumns>
void printArray(int (&theArray)[numberOfRows][numberOfColumns])
{
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x][y] << " ";
        }
        cout << endl;
    }
}

Demonstratie: http://ideone.com/MrYKz

Hier is een variant die de ingewikkelde syntaxis van arrayverwijzingen vermijdt: http://ideone.com/GVkxk

Als de grootte dynamisch is, kunt u geen van beide sjabloonversies gebruiken. U hoeft alleen te weten dat C en C++ array-inhoud in rij-hoofdvolgorde opslaan.

Code die werkt met variabele grootte: http://ideone.com/kjHiR


Antwoord 2, autoriteit 29%

Aangezien theArraymultidimensionaal is, moet u de grenzen van al zijn dimensies specificeren in het functieprototype (behalve de eerste):

void printArray(int theArray[][3], int numberOfRows, int numberOfColumns);

Antwoord 3, autoriteit 14%

Ik ben op de hoogte van de datum van dit bericht, maar voor de volledigheid en misschien voor toekomstig gebruik, is het volgende een andere oplossing. Hoewel C++ veel standaardbibliotheekfaciliteiten biedt (zie std::vectorof std::array), die het leven van de programmeur in dit soort gevallen gemakkelijker maakt in vergelijking met de ingebouwde array intrinsieke concepten op laag niveau, als je toch je printArraymoet aanroepen als volgt:

printArray(sally, 2, 3);

u kunt de functie op deze manier opnieuw definiëren:

void printArray(int* theArray, int numberOfRows, int numberOfColumns){
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x * numberOfColumns + y] << " ";
        }
        cout << endl;
    }
}

Let in het bijzonder op het eerste argument en de subscriptbewerking:

  • de functie heeft een pointer nodig, dus je geeft de naam van de multidimensionale array, die ook het adres is, door aan het eerste element.

  • Binnen de subscriptbewerking (theArray[x * numberOfColumns + y]) krijgen we toegang tot het sequentiële element door de multidimensionale array als een unieke rijarray te beschouwen.


Antwoord 4

Als u array als argument doorgeeft, moet u de grootte van de dimensies specificeren, behalve de eerste dim. De compiler heeft deze nodig om de offset van elk element in de array te berekenen. Stel dat u printArrayleuk vindt

void printArray(int theArray[][3], int numberOfRows, int numberOfColumns){
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x][y] << " ";
        }
        cout << endl;
    }
}

Other episodes