реклама на сайте
подробности

 
 
> Как элегантно с С++ сделать многомерный массив в С99 нотации?
iiv
сообщение Feb 1 2016, 12:22
Сообщение #1


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Добрый день,

имеем код, который без ошибок компилится в С99 и отказывается компилиться в С++ (хоть в 14, хоть в 11 стандарте). Основная проблема - массив, то есть в функции test, пришедший одномерный массив А маппится в 2-мерный, хочется такую же конструкцию также коротко и ясно использовать с С++, конкретно в GNU. Нужна именно конструкция без указателя на указатель, иначе работать будет долго (конкретно в этом примере - все равно, но если так сделал с пермутацией 5-мерного массива, скорость будет очень заметна).

Пожалуйста, посоветуйте, если ли какой-то красивый способ в С++, или способом является не переход с С99 на С++?

Спасибо

ИИВ

Код
#include <stdio.h>

void test(const int N, const int M, int *A)
{ int i, j;
   typedef tA[M];
   tA *pA=(void*)A;
   for(i=0; i<N; i++)
     for(j=0; j<M; j++)
       pA[i][j]+=(i-j)*(i-j);
   return;
}

int main(void)
{ const int M=10;
   const int N=12;
   int A[N][M];
   int i, j;
   for(i=0; i<N; i++)
     for(j=0; j<M; j++)
       A[i][j]=-(i-j)*(i-j);
   test(N, M, (int*)A);
   for(i=0; i<N; i++)
     for(j=0; j<M; j++)
       printf("%d ", A[i][j]); // если все правильно, то должны напечататься нули
   printf("\n");
   return 0;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smalcom
сообщение Feb 1 2016, 12:39
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Не поймите меня неправильно, но не совсем понял, что надо. Понял только, что надо C99 конвертировать в C++11(на 14-й пока не полагайтесь - поддержка в гцц сего нова и могут быть косяки).
Вот приложил причёсанный и конвертированный код

Код
#include <stdio.h>

void test(const int N, const int M, int *A)
{
using tA = int[M];

    tA *pA = (tA*)A;
    for(size_t i = 0; i < N; i++)
    {
        for(size_t j = 0; j < M; j++) pA[i][j] += (i-j) * (i-j);
    }
}

int main(void)
{
constexpr int M = 10;
constexpr int N = 12;

int A[N][M];

    for(size_t i = 0; i < N; i++)
    {
        for(size_t j = 0; j < M; j++) A[i][j] = -(i-j) * (i-j);
    }

    test(N, M, (int*)A);
    for(size_t i = 0; i < N; i++)
    {
        for(size_t j = 0; j < M; j++) printf("%d ", A[i][j]); // если все правильно, то должны напечататься нули
    }

    printf("\n");

    return 0;
}


Цитата
smalcom [ ~ ]$ g++ -std=gnu++11 1.cpp -o prog
smalcom [ ~ ]$ ./prog
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


доказательство порядочности программы )))
Цитата
smalcom [ ~ ]$ valgrind --leak-check=full ./prog
==5138== Memcheck, a memory error detector
==5138== Copyright © 2002-2013, and GNU GPL'd, by Julian Seward et al.
==5138== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==5138== Command: ./prog
==5138==
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
==5138==
==5138== HEAP SUMMARY:
==5138== in use at exit: 72,704 bytes in 1 blocks
==5138== total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==5138==
==5138== LEAK SUMMARY:
==5138== definitely lost: 0 bytes in 0 blocks
==5138== indirectly lost: 0 bytes in 0 blocks
==5138== possibly lost: 0 bytes in 0 blocks
==5138== still reachable: 72,704 bytes in 1 blocks
==5138== suppressed: 0 bytes in 0 blocks
==5138== Reachable blocks (those to which a pointer was found) are not shown.
==5138== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==5138==
==5138== For counts of detected and suppressed errors, rerun with: -v
==5138== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 16:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01369 секунд с 7
ELECTRONIX ©2004-2016