Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172

Обращение к массиву Edit

10.10.2013, 16:22. Показов 2807. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот объявляю массив из Edit:

C++
1
2
3
4
5
6
TForm1 *Form1;
//---------------------------------------------------------------------------
 
.....
 
TEdit *ShiftEdit[3];
Далее, из FormCreate я вызываю функцию:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void PlaceElements() //размещение элементов
.....
    int j;
    for (j = 0; j < 4; j++) { 
 
.....
        ShiftEdit[j]=new TEdit(Form1);
        ShiftEdit[j]->Parent=Form1->PageControl1->Pages[j+1];
        ShiftEdit[j]->Text = ""; ShiftEdit[j]->Font->Size=12; ShiftEdit[j]->Width=100;
 
        ShiftEdit[j]->Top=br; l->Left=br; l->Top=(ShiftEdit[j]->Height-l->Height)/2+ShiftEdit[j]->Top;
.....

Внутри функции PlaceElements я могу обращаться к элементам данного массива, например:
C++
1
ShiftEdit[0]->Text="fdwiuywer";
Но когда пробую работать с массивом вне функции:
C++
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ShiftEdit[0]->Text="fdwiuywer2";
}
выполнение программы останавливается (при нажатии на Button1) с сообщением об ошибке. Что я делаю не так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2013, 16:22
Ответы с готовыми решениями:

Добавление с Edit в Items Combox и после этого в Edit на другую форму
Доброго времени суток. Вопрос такой. В общем, надо помочь с такой штукой. При вводе текста в Edit необходимо при нажатии кнопки перенести в...

Ограничение ввода русских букв в Edit. Всплывающая подсказка над Edit'ом
Добрый день, обращаюсь за помощью по следующим двум вопросам. 1) В Edit нужно чтобы вводились только буквы англ. и рус. void __fastcall...

Перенос из одного Edit в другой Edit на разных формах (ошибка)
Доброго всем дня. Вопрос такой. Хочу передать результат со второго Едита на второй форме, на 7 сЕдит 7 формы. в общем пробовал так: В...

22
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
10.10.2013, 18:01
Массив TEdit *ShiftEdit[3];, т.е. от 0 до 2, а в цикле for (j = 0; j < 4; j++) { обращаемся к элементу ShiftEdit с номером 3. Это вполне может вызвать ошибку.
1
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
10.10.2013, 18:12  [ТС]
Цитата Сообщение от skaa Посмотреть сообщение
Массив TEdit *ShiftEdit[3];, т.е. от 0 до 2, а в цикле for (j = 0; j < 4; j++) { обращаемся к элементу ShiftEdit с номером 3. Это вполне может вызвать ошибку.
Это вы верно заметили, спасибо за замечание. Исправил на TEdit *ShiftEdit[4];

Но всё равно проблема сохранилась - именно при нажатии на Button1 программа вылетает с сообщением:

Миниатюры
Обращение к массиву Edit  
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
10.10.2013, 19:52  [ТС]
Сейчас набросал с чистого проекта такое:

C++
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
TEdit *ShiftEdit[3];
 
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    int j;
    for (j = 0; j < 4; j++) {
    ShiftEdit[j]=new TEdit(Form1);
    ShiftEdit[j]->Parent=Form1;
    ShiftEdit[j]->Top=j*30;
    }
    ShiftEdit[0]->Text="111";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ShiftEdit[0]->Text="222";
}
//---------------------

Всё хорошо работает. У меня, значит, что-то не так. (Но, вроде, я всё представил, что имеет отношение к моему массиву...) Попробую покопаться...

Добавлено через 14 минут
Нашёл, в чём причина! В FormCreate после вызова PlaceElements(); у меня идёт LoadData(); - загрузка данных в массив эдитов. Удалил вызов LoadData - всё заработало. Значит, я неправильно пишу функции загрузки и сохранения (при выходе) данных.

Вот, покажу как пытался написать:

C++
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
void SaveData()
{
    FILE  *fp;
    int i;
 
  if((fp=fopen("file.dat", "wb+"))==NULL) {
    printf("Ошибка при открытии файла.\n");
    exit(1);
  }
 
      for (i = 0; i < 4; i++) {
        if(fwrite(&ShiftEdit[i],10, 1, fp)!=1) printf("Ошибка при записи файла.\n");
      }
 
  fclose(fp);
 
}
 
void LoadData()
{
    FILE  *fp;
    int i;
 
    if((fp=fopen("file.dat", "rb"))==NULL) {
    printf("Ошибка при открытии файла.\n");
    return;
    }
 
    for (i = 0; i < 4; i++) {
        if(fread(&ShiftEdit[i],10, 1, fp)!=1) {
         if(feof(fp)) break;
         printf("Ошибка при чтении файла.\n");
      }
    fclose(fp);
    }
}
Добавлено через 1 час 4 минуты
Цитата Сообщение от skaa Посмотреть сообщение
Массив TEdit *ShiftEdit[3];, т.е. от 0 до 2, а в цикле for (j = 0; j < 4; j++) {
Ещё вернусь к этому замечанию. Почему, кстати, компилятор не ругался, а спокойно создавал 4-й элемент? (Builder XE5)
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
10.10.2013, 20:10
В языке C/C++ (я считаю что это один и тот же язык ) компилятор не следит за размерами массива, это право предоставляется разработчику .
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
10.10.2013, 20:16  [ТС]
Цитата Сообщение от skaa Посмотреть сообщение
В языке C/C++ (я считаю что это один и тот же язык ) компилятор не следит за размерами массива, это право предоставляется разработчику .
Тогда, вообще писать размерность массива имеет какой-то смысл?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
10.10.2013, 20:17
Вас линкер поймает по размеру heap...
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
10.10.2013, 20:30
Ну конечно есть!!! Если мы объявляем массив char A[3], то это значит что мы резервируем 3 байта памяти, и если пытаемся после этого сделать что-то типа A[4]='x', то этот 'x' запишется в область памяти которая зарезервирована под что-то другое, а следовательно нас ждут непредвиденные последствия .

Добавлено через 1 минуту
А если размерность массива вообще не писать, то это уже будет не массив .
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
10.10.2013, 20:47  [ТС]
Цитата Сообщение от skaa Посмотреть сообщение
Ну конечно есть!!! Если мы объявляем массив char A[3], то это значит что мы резервируем 3 байта памяти, и если пытаемся после этого сделать что-то типа A[4]='x', то этот 'x' запишется в область памяти которая зарезервирована под что-то другое, а следовательно нас ждут непредвиденные последствия .
Понятно, но странно, что компилятор, который стараются сделать интеллектуальнее, отслеживая наши ошибки, не поддерживает такую простую вещь, как проверка выхода за пределы массива.
(Кстати, в вашем примере, наверное, лучше показать недопустимость использования A[3]='x', чем 4 (массив начинается с 0), то же в чём я ошибся.)
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
10.10.2013, 21:12
Всё правильно, индекс A[3] уже нельзя использовать, но компилятор пропустит, равно как и A[4], A[8], A[-1]. Нагрузить компилятор проверкой индексов невозможно. Что он должен делать например в таком случае:
C++
1
2
3
4
5
  char  A[3];
  int   j;
 
  for(j=0;j<StrToInt(Edit1->Text);j++)
    A[j]=123;
?
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
10.10.2013, 21:16
Цитата Сообщение от skaa Посмотреть сообщение
Что он должен делать например в таком
- выругаться (как это он часто делает), что 'int' не является ожидаемым 'const int'
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
10.10.2013, 22:06
А он не ругается... И правильно делает - не могут ведь все циклы быть с постоянными границами .
0
2 / 2 / 0
Регистрация: 26.08.2013
Сообщений: 14
10.10.2013, 22:50
Цитата Сообщение от Obert Посмотреть сообщение
fread(&ShiftEdit[i],10, 1, fp)
fwrite(&ShiftEdit[i],10, 1, fp)
почему ты записываешь только 10 байт? у тебя ShiftEdit не полностью сохраняется
и кажись так ты Edit целиком не сохранишь

Добавлено через 16 минут
Цитата Сообщение от skaa Посмотреть сообщение
А он не ругается... И правильно делает - не могут ведь все циклы быть с постоянными границами .
может быть и такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int A[3], *a, *b, *c, x;
a = &A[0];
b = &A[1];
c = &A[2];
 
*a = 1;
*b = 3;
*c = 5;
 
x = b[-1] + b[0] + b[1]; // x = 9
x = *a + *b + *c; // x = 9
x = A[0] + A[1] + A[2]; // x = 9
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
10.10.2013, 23:57  [ТС]
Цитата Сообщение от ra6xx Посмотреть сообщение
почему ты записываешь только 10 байт? у тебя ShiftEdit не полностью сохраняется
и кажись так ты Edit целиком не сохранишь
10 байт - это специально, мне важны только первые символы, остальное пусть обрезается. (Может, из-за этого и не работает?)
0
2 / 2 / 0
Регистрация: 26.08.2013
Сообщений: 14
11.10.2013, 07:45
Цитата Сообщение от Obert Посмотреть сообщение
мне важны только первые символы
fread(ShiftEdit[i]->Text [1],10, 1, fp)
fwrite(ShiftEdit[i]-> Text [1],10, 1, fp)

попробуй так
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
11.10.2013, 15:01  [ТС]
Цитата Сообщение от ra6xx Посмотреть сообщение
fread(ShiftEdit[i]->Text [1],10, 1, fp)
fwrite(ShiftEdit[i]-> Text [1],10, 1, fp)

попробуй так
Не компилирует.

Вот я попробовал так:
C++
1
fwrite("555",10, 1, fp);
- смотрю выходной файл как текст - записываются пятёрки, всё как надо.

Но если так:
C++
1
2
3
4
String s;
...
s="555" ;
fwrite(s,10, 1, fp);
- уже компилятор не принимает. Почему же не могу строку "555" заменить на переменную String? Если бы принимало строковые переменные, то можно уже использовать ShiftEdit[i]-> Text.

(Раньше на Delphi программировал, таких проблем не было, только недавно стал изучать C++.)
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
11.10.2013, 15:30
У fwrite первым параметром идет указатель (адрес) на массив, откуда берутся данные для записи. Со строкой так не проходит; сделайте char[] - и балуйтесь.
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
11.10.2013, 15:44  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
У fwrite первым параметром идет указатель (адрес) на массив, откуда берутся данные для записи. Со строкой так не проходит; сделайте char[] - и балуйтесь.
Если так:

C++
1
2
3
4
    String s;
...
s="555" ;
fwrite(&s,10, 1, fp);
то в файл уже записывает какую-то ерунду, но не пятёрки.

А, не понял, где char[] сделать?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
11.10.2013, 15:47
- ну массив организуйте; вместо s или в дополнение к ней. Копируйте 555 в массив и с массива же выводите.
Может кто лучшую идею подкинет, - со строкой - я тоже интересуюсь... .
1
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
11.10.2013, 17:41  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
- ну массив организуйте; вместо s или в дополнение к ней. Копируйте 555 в массив и с массива же выводите.
Может кто лучшую идею подкинет, - со строкой - я тоже интересуюсь... .
Да, так работает:

C++
1
2
3
4
5
6
    String s;
    char c[10];
.......
    s="567";
    c[0]=s[1];
    fwrite(&c[0],10, 1, fp);
Пятёрку записывает. Хоть и длинноват получится вариант. Попробую теперь прикрутить к этому ShiftEdit[i]->Text.

Добавлено через 14 минут
Вот так работает:
C++
1
2
3
4
    char c;
    .........
        c=ShiftEdit[0]->Text[j];
    fwrite(&c,10, 1, fp);
(Только j не должно быть больше длины текста, иначе программа вылетает. Но это решаемо, хотя и способ получается длинноват.)

Добавлено через 19 минут

Вот, если кому интересно, окончательный, рабочий вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const MaxPrefLen=10;
......
  if((fp=fopen("file.dat", "wb+"))==NULL) {
    printf("Ошибка при открытии файла.\n");
    exit(1);
  }
 
      for (int i = 0; i < 4; i++) {
        byte L=ShiftEdit[i]->Text.Length();
        if (L>MaxPrefLen) L=MaxPrefLen;
        fwrite(&L,1, 1, fp); // записываем длину 
            for (int j = 0; j < L; j++) {
                c=ShiftEdit[i]->Text[j+1];
                fwrite(&c,1, 1, fp);
            }
 
 
 
      }
 
  fclose(fp);
Записываю длину строки, потом саму строку посимвольно. Считывать буду в том же порядке.

Добавлено через 15 минут
Вот ещё маленькая непонятка. Чтобы не писать fopen("file.dat"... я хотел ввести строковую константу, но как в Делфи такое не работает:
const DataFile="otto.dat";

Хорошо, использую переменную:
String DataFile="otto.dat"; // имя файла данных

Но компилятор не принимает
fp=fopen(DataFile, "rb")

Добавлено через 17 минут
Блин, русские символы из ShiftEdit[i]->Text не сохраняются!

Добавлено через 7 минут
При создании эдитов ShiftEdit[j]->Font->Charset=RUSSIAN_CHARSET; не помогло.

Добавлено через 21 минуту
Русские буквы сделал! Использовал wchar_t вместо char и записываю/считываю уже по 2 байта вместо одного.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2013, 17:41
Помогаю со студенческими работами здесь

Считать с Edit текст, убрать последний символ из строки и снова записать в Edit
Всем доброго времени суток. У меня тут возник вопрос, как можно считать с Edit текст, а потом убрать последний символ из этой строки и...

Запись в файл из полей Edit и проверка Edit на пустоту
TForm1 *Form1; int Ext=0; int i; //--------------------------------------------------------------------------- __fastcall...

Вывести в 11-ый Edit минимальное из значений предыдущих 10-ти Edit-ов
Всем привет. У меня такая задача: есть 10 едитов(Edit1-Edit10) я ввожу в них числа и должно в Edit11 вывести минимальное из чисел. Помогите...

Обмен значениями между Edit 1 и Edit 2
Доброго времени суток, помогите пожалуйста , покажите мне пожалуйста простейший фрагмент кода , в котором выполняется условие кнопки : ...

ТЕКСТ: С Edit'a в масив и обратно в EDIT
вот у меня задание (сам себе захотел научиться) но так и не научился ( зхотел ТЕКСТ перевести в масив (чтобы потом работать с елементами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru