1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Ну, наверное все-таки потому, что printf не меняет входные параметры, они копируются в стек и выводятся на печать, а scanf как раз-таки должна значения параметров изменить (в этом и состоит ее задача), а сделать это можно только передав ссылку или указатель на аргумент (ссылок в чистом С еще не было, остаются только указатели).
Короче вот какой вопрос.У меня есть структура и указатель на нее по ходу выполнения мне надо под нее выделять память.Я решил сначало попробовать на простом примере
struct cel { int znac; char name[NAME];//вот структура }*CP;
............................................................ CP=(struct cel*)malloc(sizeof(struct cel )); realloc(CP,2*sizeof(struct cel )); CP[0].znac=20; printf("%d",CP[0].znac); free(CP);//при выполнении данной ф.и вылетает
Сначала выделяю память под 1 элемент.Подом добавляю памяти под второй.Так вот все ли я делаю правильно?И как потом эту память очистить? free(CP) не прокатывает.
Скажи спасибо альфонсу, который посоветовал прочесть книгу Дейтела... Читай, наверное ее чтение само собой сделает свое дело, и ты больше не будешь задавать вопросов по С++... Там же все очень просто? Ну, так в чем дело?
Читаешь книгу, идешь спать... Проснулся - С++ стал тебе родным... Идиллия, правда? И главное - без усилий с твоей стороны, достаточно только прочитать, ведь "все ОЧЕНЬ просто!" (С)
Скажи спасибо альфонсу, который посоветовал прочесть книгу Дейтела... Читай, наверное ее чтение сделает свое дело, и ты больше не будешь задавать вопросов по С++... Там же все очень просто? Ну, так в чем дело?
Да в том что неполучается освободить память после realloc на ф.и free(CP) выдается сообщение о том что обнаружена ошибка.
Добавлено через 2 мин. Блин ну я и тупой........Всегото надо CP=(struct cel*)realloc(CP,2*sizeof(struct cel ));
Вот еще попрос в паскале, когда пишешь модуль с обьектом переменные(обекта) видны во всех процедурах и тд. А в с++ как надо сделать что бы переменная была видна на весь модуль ?
В С++ надо описать поле класса общим (в секции public) или пользоваться struct-урами, там поля общие по умолчанию, если не задашь другой метод доступа...
А вообще, это плохой стиль - давать всем подряд обращаться к полям класса. Лучше сделай Getter/Setter этой переменной, и дай им общий доступ, а саму переменную скрой в private-секции (так у тебя будет хоть какой-то контроль за тем, как изменяется поле класса; ведь может быть ситуация, что поле нельзя изменять, и вдруг какая-то посторонняя процедура берет и меняет его... Setter не должен ей этого позволить, если это на данный момент недопустимо)
Нет ты, к сожалению, не так меня понял. Я имею возможность обращатся в метадах обьекта напрямую не записывая в параметры мою переменную. А так, да, конечно, если сделать обращение напрямую, потом не разберешся, что где когда меняешь.
Я имею возможность обращатся в метадах обьекта напрямую не записывая в параметры мою переменную.
В методах объекта и в С++ ты можешь общаться со всеми полями напрямую... Разговор был о "снаружи", не правда ли?
Цитата
что бы переменная была видна на весь модуль
(на модуль, а не на класс, чувствуешь разницу?)
Или
class base { int value;
public: base(int val = 0): value(val) {} int getValue() const { return value; } };
и читай переменную, сколько влезет, но записать в нее тебе никто не даст (только изнутри класса или friend-function)... Или, если хочешь программировать в стиле Паскаля:
Ты ж читаешь число, а не строку через scanf("%d"), а работаешь с day, как со строкой? Это во-первых... Во вторых: что за метка?
Достаточно было сделать вот так:
char buffer[256]; // Это для сбрасывания введенной строки, которая НЕ является числом
int day;
while(!(scanf("%d",&day))) { gotoxy(x, 2); day = -1; // Ну, или любое другое значение, неважно gets(buffer); // убираем из буфера строку, чтобы читать заново puts("Ошибка. Попробуйте еще раз... "); };
Это ты у разработчиков С спрашивай, зачем им понадобилось, чтобы scanf работала с адресами... Наверное, чтобы введенное значение можно было вернуть из функции. Иначе зачем scanf вообще нужна?
(где k количество параметров).Как мне внутри этой ф.и передать необязательные параметры ... в ф.ю на которую указывет этот указатель int(*p)(int,...), и в которой тоже переменное число параметров?Можно так вообще сделать или нет?
Вопрос #7 Вот есть программа, от которой я хотел бы составление последовательностей и вывод этого чуда.. Но увы она этого не делает( Наверно опять начудил с индексами.. Помогите..
#include <iostream> #include <vector> #include <cstdlib> using namespace std; int main(void){ const int number_el(6); //количество элементов const int number_seq(6); //количество последовательностей
for(int i(0); i<number_seq; ++i){ for(int j(0); i<number_el; ++j) // Тут точно все, как надо? Может I не нужно? cout << (*seq_addrs[i])[j] << '\t'; cout <<'\n'; }
Кстати, обрати внимание на предупреждение... Лучше приводить результат к типу int явным образом...