2016-10-14 2 views
1

Я должен проверить один байт в 200 таблицах. Я не хочу писать 200 строк, чтобы проверить это. У вас есть какие-либо советы, чтобы сделать это с помощью цикла for?Задачи повторения и для цикла

Моего пример кода:

#include <stdio.h> 
#include "CUnit/Basic.h" 
#include "CUnit/Console.h" 
#include "CUnit/Automated.h" 
#include "CUnit/CUCurses.h" 
#include "CUnit/TestDB.h" 

void _testu(){ 
    CU_ASSERT_EQUAL(55, my_tab_0[5]); 
    CU_ASSERT_EQUAL(55, my_tab_1[5]); 
    CU_ASSERT_EQUAL(55, my_tab_2[5]); 
    CU_ASSERT_EQUAL(55, my_tab_3[5]); 
    . 
    . 
    . 
    CU_ASSERT_EQUAL(55, my_tab_n[5]); 
} 
+1

Вопрос: Почему у вас есть 'n' массивы, а не массив, содержащий ваши массивы? – RichouHunter

+1

Я бы рекомендовал использовать массив массивов. Например, 'char my_tab [200] [5];' –

+0

Я не могу изменить свою структуру данных. – Jguillot

ответ

3

Если у вас есть п независим массивы, вы могли бы попытаться построить массив указателей:

char *my_tab[] = { my_tab_0, my_tab_1, m__tab_2, ... my_tab_n }; 

вы можете их просто:

void _testu(){ 
    int i; 
    for(i=0; i<=n; i++) { 
     CU_ASSERT_EQUAL(55, my_tab[i][5]); 
    } 
} 

Это, в основном имеет смысл если вы используете более одного цикла.

+0

определенно чище, чем мой ответ +1 –

+0

вам все равно нужно жестко закодировать записи 'my_tab_ ' , который редактор может по-прежнему быть хорошим для –

+0

Знаете ли вы, как я могу восстановить размер my_tab_0? 'sizeof (my_tab [0])' не дает мне правильный – Jguillot

1

Поскольку вы не можете изменить структуру данных, рекомендуется использовать дополнительные инструменты текстового редактора, чтобы написать эти строки для вас. Это не самый ортодоксальный способ справиться с этим, но он работает, и это по крайней мере быстро и понятно. В Emacs, я хотел бы рассмотреть два варианта:

1: написать цикл, который генерирует отформатированную строку для вас:

(defun copy_iter (strng times) 
    (let ((result)) 
    (dotimes (i times result) 
     (setq result (concat result "\n" (format strng i)))))) 

И вызова (copy_iter "CU_ASSERT_EQUAL(55, my_tab_%s[5]);" 200) будет возвращать то, что вы ожидаете

2: скопируйте общую строку 200 раз, а затем замените маркер с помощью регулярных выражений:

1) скопируйте строку с общим маркером 200 раз (here как):

" 
CU_ASSERT_EQUAL(55, my_tab_<CHANGE_THIS>[5]); 
CU_ASSERT_EQUAL(55, my_tab_<CHANGE_THIS>[5]); 
CU_ASSERT_EQUAL(55, my_tab_<CHANGE_THIS>[5]); 
CU_ASSERT_EQUAL(55, my_tab_<CHANGE_THIS>[5]); 
CU_ASSERT_EQUAL(55, my_tab_<CHANGE_THIS>[5]); 
... 

2) называют замену на регулярное выражение, с входом: <CHANGE_THIS> и выход: \# также оставил ожидаемую строку, как описано here.

Конечно, emacs - всего лишь предложение. Главный момент моего ответа - показать, что иногда (или довольно много раз) текстовый редактор сам может помочь нам преодолеть такие проблемы. Я надеюсь, что это помогает!

Приветствия

+0

Я не хочу «копировать/вставлять» мой код, но я действительно хочу реализовать цикл, который проверяет мой байт, но я принимаю во внимание ваш ответ для своих будущих проектов! – Jguillot

+0

вам все равно нужно это сделать в любом случае после принятого ответа, который я признаю гораздо чище (если все ваши массивы имеют одинаковый размер) –

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