|
|
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
я пока только начинаю, похтому появился вопрос: Как инициализировать матрицу со строками переменной длины? Пример. Есть файл со строками целых чисел(максимум трехзначных). Надо создать массив, полное отражение файла. Пока делаю примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Корректна ли такая реализация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 15:38:16 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Галина Зайцева пишет: > Корректна ли такая реализация? Нет realloc returns a void pointer to the reallocated (and possibly moved) memory block. If there is not enough available memory to expand the block to the given size, the original block is left unchanged, and NULL is returned т.е. должно быть что-то типа : chisla = realloc(chisla, j*ed_size); и потом еще и проверка ошибки выделения памяти. > chisla[j-*1*] = chis; > ++j; > } > ++i; > } > > return *0*; > } > > Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 16:44:11 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Еще пара комментариев. Галина Зайцева пишет: > int *chisla[5]; Массив размером 5 указателей, а по тексту не видно ограничения в пять строк - на шестой строке будет переполнение. Кроме того, массив не инициализируется, значит realloc будет работать с мусором. > char str_ch[4]; Размер строки - всего 3 символа > fd = fopen("proto_arr.dat", "r"); Работет под win32? Добавте t в режит открытия- "rt" > while(fgets(fd, 120, str_ch) != "\n"){ Тут вы сравниваете адреса, а не строки - напишите strcmp. Но не забедьте, что последняя строка может завершаться нулем, а по концу файла fgets возвращает NULL. Кроме того, в строку длиной три символа вы читаете 120 - явное переполнение. Инициализировать элемент массива можно здесь (chisla = NULL) > while(sscanf(str_ch, "%8d", &chis) > 0){ sscanf будет читать каждый раз с начала строки одно и тоже число - нужно увеличивать указатель, пропуская прочитанную область. Дальше уже написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 17:06:23 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. что неправильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 17:12:41 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 17:16:14 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
teras Галина Зайцева пишет: > int *chisla[5]; Массив размером 5 указателей, а по тексту не видно ограничения в пять строк - на шестой строке будет переполнение. Кроме того, массив не инициализируется, значит realloc будет работать с мусором. как его инициализировать? Думаю именно поэтому и не работает. Остальное вроде переделала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 17:20:08 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Галина Зайцева wrote: > while (fgets(c_str, 256, fd) != NULL){ > printf("%s\n", c_str); при считывании строки через fgets, будет считан также символ переноса строки, т.е. "\n". У вас будут пустые строки между строчками. Далее, что делает вот это? > parse_str(c_str, dyn_arr ); как я понимаю, работать оно не будет, что бы там не было. dyn_arr содержит указатель, который указывает "в никуда", и вы этот указатель передаете в функцию как аргумент. В результате, вот тут: > printval(dyn_arr); на экран будет выведен мусор, и есть хороший шанс, что произойдет accessviolation. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 17:25:41 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
ErV Галина Зайцева wrote: > while (fgets(c_str, 256, fd) != NULL){ > printf("%s\n", c_str); при считывании строки через fgets, будет считан также символ переноса строки, т.е. "\n". У вас будут пустые строки между строчками. я дописала, чтобы последний символ менялся на '\0'. Если под инициализацией понималось, присвоение начальных нулей, то я это сделала. Спасибо. ErVДалее, что делает вот это? > parse_str(c_str, dyn_arr ); как я понимаю, работать оно не будет, что бы там не было. dyn_arr содержит указатель, который указывает "в никуда", и вы этот указатель передаете в функцию как аргумент. В результате, вот тут: > printval(dyn_arr); на экран будет выведен мусор, и есть хороший шанс, что произойдет accessviolation. Posted via ActualForum NNTP Server 1.4 теперь все выглядет так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 17:54:57 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
сдаюсь. Как передать массив так, чтобы можно было его заполнить ((? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 18:09:58 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Галина Зайцева wrote: > char promstr[4]; Это массив из 4х символов. Если хотите 4 строки, то надо char* promstr[4]; >сдаюсь. Как передать массив так, чтобы можно было его заполнить ((? char** т.е., например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Вообще, если вам надо динамические массивы и т.д., попробуйте воспользоваться stl контейнерами типа vector, list и т.д. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2007, 22:07:27 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
ErV > char promstr[4]; Это массив из 4х символов. Если хотите 4 строки, то надо char* promstr[4]; В данном случае нужна именно строка в четыре символа. В нее парсируется число (оно может быть максимым трехзначное плюс завершающий нуль. Теперь код выглядет примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. но все же это не то, чего бы хотелось. Так как память выделяется заранее. А использованность сохраняется в параметре count. А если все же надо будет читать больше, чем выделено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 11:20:46 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Галина Зайцева wrote: > А если все же надо будет читать больше, чем выделено? > Возьмите stl контейнеры! push_back и push_front в комбинации с std::string (или что вам там надо) решат эти проблемы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 17:38:02 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
ErV Галина Зайцева wrote: > А если все же надо будет читать больше, чем выделено? > Возьмите stl контейнеры! push_back и push_front в комбинации с std::string (или что вам там надо) решат эти проблемы. А оно есть в простом Си. Который не объектный? Я пока на простом Си учусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 23:25:57 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Галина ЗайцеваА оно есть в простом Си. Который не объектный? Я пока на простом Си учусь.Нет, нету. Зато в простом Си есть списки которые с легкостью решают задачу безразмерных массивов без лишних перераспределений памяти. Вам структуры уже давали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 02:04:49 |
|
||
|
Массивы переменной длины. Инициализация.
|
|||
|---|---|---|---|
|
#18+
Галина Зайцева но все же это не то, чего бы хотелось. Так как память выделяется заранее. А использованность сохраняется в параметре count. А если все же надо будет читать больше, чем выделено? Или два прохода (при первом проходе подсчитывается количество строк чисел), или первым числом в файле proto_arr.dat должно быть записано количество строк в файле. Смотрел прогу. В ней есть пару ошибок. Напр. символ перевода строки: '\n'. '\t' - это табуляция. Потом выделенную память хотя бы при выходе из программы желательно освободить. Вместо int *dyn_arr; нужно int **dyn_arr; И в процедуре parse_str после перекопирования цифр числа в promstr, нужно было бы дописать нулевой символ. Но не можно не признать, что для начала совсем не плохо. :) P.S. Если я правильно понял, то в arr_vorlage.dat числа отделяются друг от друга ОДНИМ пробелом и строка начинается с цифры или знака минус. Напр. -123 78 889 675 67 -1 888 5 77 999 412 -7 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 03:42:50 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34808920&tid=2028132]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
81ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 396ms |

| 0 / 0 |
