2015-10-19 4 views
0

Я пытаюсь заставить эту простую программу работать, но у меня есть некоторые ошибки, которые я не понимаю, поскольку я новичок в C++. Я получаю не объявленную область действия для инициализации моей функции, и у меня возникают проблемы с использованием массивов в заголовке функции. Может кто-то мне помочь, пожалуйста?Работа с массивами в C++

Мой код выглядит следующим образом:

#include <iostream> 
#include <string> 
using namespace std; 

char[][] initialize(char[][]); 

int main(){ 

    int array[3][3]; 
    initialize(array); 

    cout << array[0]; 

    return 0; 
} 

char[][] initialize(char[][] a){ 

    for(int i = 0; i < a.length(); i++){ 
     for(int j = 0; j < a[].length(); j++){ 
      a[i][j] = '\0'; 
     } 
    } 

    return a; 

} 
+2

Нет информации или функции 'length()' для необработанных массивов. Вместо этого используйте 'std :: vector' (и' size() '). –

+0

Это не моя главная проблема на данный момент. Я получаю не объявленную область действия для инициализации моей функции и ошибки чтения ожидаемого неквалифицированного идентификатора перед '[' токеном. Любые идеи о том, почему возникают эти две ошибки и как их исправить? – user3540561

+1

'char [] [] initialize (char [] []);' не является допустимым объявлением, поэтому он отклоняется. Естественно, это также приведет к ошибке «не объявлено» при попытке вызвать функцию. Одна ошибка вызывает следующее. –

ответ

1

Вы можете инициализировать 2d элементов массива в \0 просто:

char array[3][3] = {0}; 

Теперь, если вы хотите передать свой массив функции (например, print_2d_array()), и для того, чтобы иметь размеры вашего 2d-массива, вам необходимо передать свой массив по ссылке следующим образом:

template<typename T, std::size_t N, std::size_t M> 
void print_2d_array(T (&a)[N][M]){ 

    for(int i = 0; i < N; ++i){ 
     for(int j = 0; j < M; ++j){ 
      std::cout << a[i][j] << " "; 
     } 
     std::cout << std::endl; 
    } 
} 

Вышеприведенная функция печатает произвольный тип/размеры массива 2d.

0

Так как вы знаете размер массива и проходящий массив по ссылке, поэтому нет необходимости возвращать массив:

void initialize(char[][3]);//declaration 

Функция:

void initialize(char a[][3]){ 
//no such function as array.lenth() 
for(int i = 0; i < 3; i++){ 
    for(int j = 0; j <3; j++){ 
     a[i][j] = '\0'; 
    } 
} 

Также я вижу, что вы объявили целочисленный массив и передается в массив char.So либо иметь целочисленный массив или массив символов, но не оба.

1

Если у вас есть фиксированные массивы, вы можете (и должны) использовать std::array вместо необработанных массивов C-стиля. Я буду использовать функцию initialize в качестве примера, хотя есть и другие способы инициализации массива.

#include <iostream> 
#include <string> 
#include <array> 
using namespace std; 

void initialize(std::array<std::array<char, 3>, 3>&); 

int main(){ 

    std::array<std::array<char, 3>, 3> array{}; 
    initialize(array); 

    return 0; 
} 

void initialize(std::array<std::array<char, 3>, 3>& a) { 
    for(auto& outer: a) { 
     for(auto& x: outer) { 
      x = '\0'; 
     } 
    } 
} 

Конечно, если вы хотите работать с массивами строк, и это то, что я думаю, что вы на самом деле хотите, вы должны сделать это и использовать std::string вместо нулевого законченных строк C-стиль.

#include <iostream> 
#include <string> 
#include <array> 


int main(){ 

    std::array<std::string, 3> array{}; 
    array.fill(std::string(3, '\0')); 

    std::cout << array[0]; 

    return 0; 
} 

инициализации не нужно в этом случае, так как std::string правильно инициализируется конструктор.

Если вам требуется динамическое хранилище, вы должны использовать std::vector вместо std::array. В любом случае, мой совет будет заключаться в использовании безопасных по типу и более удобных инструментов на C++ вместо подверженных ошибкам и, если честно, больно использовать C-эквиваленты.

+1

Лучший ответ. Две вещи: из-за ошибки в GCC, 'array {};' должен быть 'array {{}};' если скомпилирован с g ++ и 'array {};' делает функцию 'initialize' избыточной. – user4581301

0

Trick one: Сэкономьте себе передышку, объявив initialize, поставив определение функции перед main. Это устраняет один потенциальный источник ошибок.

Trick two: Йенс избил меня. Используйте std::array.

Trick three: Используйте std::vector.

#include <iostream> 
#include <string> 
#include <vector> 
//using namespace std; this can be dangerous. Recommend the following as a replacement 
using std::vector; 
using std::cout; 

void initialize(vector<vector<char>> &a) // pass vector by reference 
{ 
    for(int i = 0; i < a.size(); i++) 
    { 
     for(int j = 0; j < a[i].size(); j++) 
     { 
      a[i][j] = '\0'; 
     } 
    } 
} 

int main() 
{ 
    vector<vector<char>> array(3, vector<char>(3)); 
    initialize(array); 

    cout << array[0][0]; 

    return 0; 
} 

Две точки, чтобы сделать здесь

  1. Это имеет проблемы с производительностью. Вектор векторов (или массив массивов) вряд ли будет иметь смежность (память в одном блоке) и приведет к ненужным задержкам, загружая данные массива из ОЗУ в кеш. Если все данные близки друг к другу и достаточно малы для соответствия, одно чтение кеша получит весь массив. Если она разбросана, каждая часть должна быть прочитана отдельно, и загрузка одной части может перезаписать другую, заставляя ее снова загружаться (которая может писать по другому фрагменту памяти, требуется несколько инструкций, заставляющих ее перечитывать, а также это может заставить другую часть или еще один кусок из, до бесконечности. This is called Cache Thrashing.

  2. станда :: вектора может инициализировать содержимое массива для вас

Нужен текст здесь по какой-то причине, чтобы сохранить форматирование следующего кода:

int main() 
{ 
    vector<vector<char>> array(3, vector<char>(3), '\0'); 
    cout << array[0][0]; 

    return 0; 
} 

И если из-за ограничения назначений вам не разрешено использовать std::array или std::vector, тривиальный клон std::array прост в написании.

struct TwoD 
{ 
    char array[3][3]; 
    char &operator()(int row, int col) 
    { 
     return array[row][col]; 
    } 
}; 

, вероятно, все, что вам нужно.

Смежные вопросы