Как вывести void в c
Перейти к содержимому

Как вывести void в c

  • автор:

Обращение к функции типа void

Функции типа void
Добрый вечер, у меня есть проблема, которую я не могу решить. Есть функция типа void. Суть этой.

Как вводить функции типа void
прошу помощи я полнейший ноль в программировании а в универе ездят этими прогами хоть и не по.

Аналог break для функции типа void
надо сделать так , на месте break функция ничего не сделала void push(Stack *tmp, int element).

Указатель типа void на функцию, вызов функции
Необходимо с помощью указателя типа void запустить функцию. void func(int); int main()< void.

7428 / 5021 / 2891
Регистрация: 18.12.2017
Сообщений: 15,692

Лучший ответ

Сообщение было отмечено alayyy как решение

Решение

1 2 3 4 5 6 7
int main() { double x0=0., xn=M_PI; int count=12; . Table(x0, xn, count); }

или просто:

1 2 3 4 5
int main() { . Table(0., M_PI, 12); }

Добавлено через 7 минут
не по Вашему вопросу, но в общем случае из-за особенностей чисел типа double строку 5 кода Вашего сообщения лучше так:

for (x = x0; x  xn+Delta/2.; x += Delta)

Добавлено через 7 минут
в строке 4 второй double не нужен — компилятор сам справится
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Прерывание работы рекурсионной функции типа void
Есть рекурсионная функция, имеющая нечто общее с функцией ниже: void function test(int b)

В чем особенность функции типа void от других типов?
В чем особенность функции типа void от других типов?

Сформировать функции типа void для формирования указанных массивов
Дано натуральное число n и действительные числа a1, a2. an. Сформировать два массива, в первый из.

Функции ввода и вывода массива произвольного типа через void
Функции ввода и вывода массива произвольного типа через void нету разницы какие данные главное.

Дважды вычислить значение выражения, используя функции возвращающие void и не void
Хай!Помогите решить Дважды вычислить значение выражения, используя функции возвращающие void.

Как вывести void в c

Смысл типа void и его предназначение тесно связаны с основной, самой мощной (и при неумелом применении деструктивной) особенностью языка C — использование указателей. Поэтому сначала нужно разобраться, что такое указатели и для чего они нужны (кто не знает, что такое указатели, см. врезку ниже).

Для работы со встраиваемыми системами критически важно хорошо программировать на языке C и иметь четкое представление о смысле указателей (здесь приведен перевод статьи [1]). Указатель так важен потому, что он позволяет программисту получить доступ к памяти системы самым быстрым и эффективным способом (что для встраиваемых систем критически важно). Память системы организована как последовательность байт (1 байт состоит из 8 битов). Если, к примеру, общая память в системе имеет размер 128 байт, то здесь будет 128 доступных ячеек, каждая из которых будет байтом, который можно прочитать и записать. Все 128 ячеек памяти будут пронумерованы числами от 0 до 127 специальным способом, примерно так: 0000, 0001, 0002, . и т. д. Это число, связанное с каждым байтом, называется адресом ячейки памяти.

Ниже на рисунке для иллюстрации всей идеи показана организация памяти некогда очень популярной архитектуры 8051.

MCS 51 Program Memory Arrangement examples

Указатель это переменная, которая содержит адрес ячейки памяти. Если, к примеру, адрес ячейки 2050H, то указатель используется для того, чтобы хранить в себе это значение адреса.

Примечание: адрес ячейки памяти это всегда положительное целое число. Диапазон адресов простирается от 0 (адрес первой ячейки памяти; часто этот адрес имеет специальное назначение, об этом позже) до положительной целочисленной константы (которая является адресом последней ячейки памяти).

[Переменные указателей]

Мы можем использовать переменные для хранения адресов памяти, и такие переменные известны как переменные указателей. Обычные переменные используются для хранения в себе значений каких-то данных определенного типа (char, int, float и т. д.). Перед использованием переменной в программе мы сначала её декларируем. Специальным образом нам нужно также декларировать переменные и для указателей – чтобы компилятор знал, что мы декларируем переменную как указатель (это не обычная переменная). Делается такая декларация с помощью оператора *, это так называемый оператор косвенного обращения на языке C (indirection operator), иногда его называют оператором разыменования.

Общий синтаксис декларации указателя следующий:

int *ptr;

Здесь мы декларировали переменную указателя с именем ptr, и этот указатель предназначен для указания на первую ячейку памяти, где находится значение типа int.

Почему для указателей нужно указывать тип данных? По некоторому адресу в памяти могут содержаться какие-то данные, и это понятно. И это может быть данные любого типа char, int, float, даже структура, и т. д. Разница между типами в том, что они могут занимать для себя разное количество памяти. Char требует 1 байт, int может требовать 2 байта (хотя это не всегда так), и float занимает 4 байта. Память, выделенная для всех этих типов это последовательность из нескольких непрерывно следующих друг за другом байт.

Давайте рассмотрим сценарий наподобие следующего, в программе определены 3 переменные:

char a;
int b;
float c;

Предположим, что память системы начинается с адреса 2000H. Теперь символьная переменная ‘a’ будет находиться по адресу 2000H (и займет в памяти 1 байт), тогда как int-переменная ‘b’ займет 2 байта и будет находиться по адресам 2001H и 2002H. И наконец, последняя float-переменная ‘c’ займет 4 байта, и они будут находится в расположенных друг за другом байтах памяти с адресами 2003H, 2004H, 2005H, 2006H. Теперь Вы можете догадаться, зачем надо указывать типы данных, чтобы объявить переменную указателя. Причина в том, что области памяти под переменные выделяются в последовательных, находящихся друг за другом байтах памяти, и количество выделенных байт зависит от типа переменной, которая в них содержится.

Примечание: показанное в этом примере распределение памяти типично для 8-разрядных систем, таких как MSC-51 и AVR. Для 16-битных и 32-разрядных систем реальное распределение памяти для переменных может быть другим, что связано с выравниванием данных в памяти с целью более эффективного использования особенностей процессора.

Таким образом, когда мы декларируем переменную указателя как float *ptr, и затем присваиваем ей адрес обычной float-переменной c, то для компилятора устанавливается привязка указателя ptr ко всей области памяти от 2003H до 2006H. Но сама переменная ptr будет хранить в себе только начальный адрес блока памяти переменной (т. е. в нашем примере это 2003H), а тип указателя будет указывать для компилятора размер этого блока.

Следовательно, чтобы компилятор мог корректно интерпретировать содержимое памяти, соответствующее указателю, для указателя должен быть при декларации указан тип данных. И этот тип данных должен совпадать с типом данных, которые находятся по адресу переменной – тому адресу, который присваивается переменной указателя. Например, если адрес 2000H будет присвоен указателю ptr, то указателю будет соответствовать память, в которой находится символьная переменная ‘a’. В этом случае переменная указателя ptr должна быть декларирована с типом char, как показано ниже:

char *ptr;

Примечание: фактически мы могли бы декларировать переменную указателя без какого либо типа данных, используя ключевое слово void. Тогда получится так называемый пустой указатель.

[Присваивание адреса переменной указателя]

Чтобы можно было использовать указатель и его возможности, указателю должен быть присвоен адрес переменной. Указателю можно присвоить адрес как одиночной переменной, так и адрес массива, так и адрес структуры, и адрес переменной класса, и даже адрес переменной указателя. Это делает указатели особенно мощным (но и достаточно опасным при неумелом использовании) инструментом в программировании на языке C. Мы можем играючи обращаться с памятью системы, используя указатели.

Чтобы присвоить адрес переменной указателя мы используем оператор & (оператор взятия адреса переменной). Оператор & возвратит начало места в памяти, где расположена переменная. Пример:

void main() < int *ptr; // Декларация переменной указателя типа int. int a; // Декларация обычной переменной типа int. ptr = &a; // Присваивание адреса переменной a указателю ptr. >

[Обращение к содержимому памяти по указателю]

Теперь мы знаем, как присваивать адрес переменной указателя. Но как можно в программе обратиться к содержимому переменной, адрес которой присвоен указателю? Для этого мы используем тот же оператор косвенного обращения *, который мы использовали для декларации переменной указателя. Операция взятия значения по указателю также называется разыменованием указателя.

void main() < int *ptr; // Декларация переменной указателя ptr на тип int. int a = 10; // Декларация обычной переменной a, и присваивание ей значения 10. ptr = &a; // Присваивание адреса переменной a указателю ptr. // Следующий оператор позволит увидеть значение переменной a, полученное // с помощью указателя ptr: printf("Значение, на которое показывает указатель = %d", *ptr); >

Запуск этого кода выведет следующую строку:

Значение, на которое показывает указатель = 10

[Арифметические операции над указателями]

С типизованным указателями указателями (т. е. с такими указателями, для которых для декларации явно указан тип) можно использовать многие операции, которые доступны с целыми числами без знака: декремент —, инкремент ++, прибавление и вычитание константы. При этом будет меняться адрес, сохраненный в указателе на величину, кратную размеру типа указателя. Например, если прибавить к указателю на float константу 1, то сохраненный в указателе адрес увеличится на 4, потому что размер типа float равен 4 байтам.

void main() < float *ptr; ptr = (float*)(0x2000); //Выведется значение 0x2000: printf("ptr = 0x%04X\r\n", ptr); ptr = ptr+1; //Выведется значение 0x2004: printf("ptr = 0x%04X\r\n", ptr); >

[Указатели void на языке C]

Обычно переменная указателя декларируется с указанием типа данных содержимого, которое хранится в том месте памяти, на которое ссылается указатель (перевод статьи [2]). Примеры:

char *ptr1;
int *ptr2;
float *ptr3;

Переменная указателя, декларированная на определенный тип, не может содержать в себе адрес переменной другого типа. Это неправильно, и приведет к сообщению об ошибке при компиляции. Пример:

char *ptr;
int var1;
ptr = &var1; // Это неправильно, потому что ptr должен указывать на переменную типа char. 

На языке C есть возможность создать указатель на неопределенный тип, так называемый «пустой указатель» (void pointer). Указатель на void это просто переменная указателя, которая декларирована с зарезервированным на языке C ключевым словом void. Пример:

void *ptr; // Теперь ptr это переменная указателя общего назначения 

Когда указатель декларируется с ключевым словом void, он становится универсальным. Это значит, что ему может быть присвоен адрес переменной любого типа (char, int, float и т. д.), и это не будет ошибкой.

[Разыменование void-указателя]

Как делается разыменование типизованных указателей с помощью оператора *, Вы уже знаете (если нет, то см. врезку «Что такое указатель»). Но в случае указателя на void нужно использовать приведение типа (typecast) переменной указателя, чтобы выполнить её разыменование (выполнить обращение к содержимому памяти, на которую ссылается void-указатель). Причина в том, что с void-указателем не связан никакой тип, и для компилятора нет никакого способа автоматически узнать, как обращаться к содержимому памяти, связанному с void-указателем. Таким образом, чтобы получить данные, на который ссылается void-указатель, мы делаем приведение указателя к корректному типу данных, которые находятся по адресу, содержащемуся в void-указателе.

void main() < int a = 10; float b = 35.75; void *ptr; // Декларация void-указателя. 
ptr = &a; // Присвоение адреса целочисленной переменной void-указателю. 
//Ниже приведен пример взятия значения целочисленной переменной //с помощью void-указателя. Здесь (int*)ptr используется для //приведения типа, и *((int*)ptr) будет ссылаться на содержимое //памяти, где находится переменная a. printf("Значение целочисленной переменой = %d", *((int*)ptr));
ptr=&b; // Присвоение адреса переменной типа float void-указателю. 
//Ниже приведен пример взятия значения float-переменной с помощью void-указателя. printf("Значение переменной типа float = %f", *((float*)ptr)); >

Указатели void полезны для программиста, когда заранее неизвестно о типе данных, которые поступают на вход программы. Типичным примером могут служить библиотечные функции манипулирования блоками памяти memcpy, memset и т. п. С помощью void-указателя программист может сослаться на место размещения данных произвольного, заранее неизвестного типа данных. Программа, к примеру, может быть написана таким образом, чтобы запросить у пользователя, какое приведение типа нужно использовать, чтобы правильно обработать входные данные. Ниже приведен в качестве примера кусок подобного кода.

void funct (void *a, int z) < //Значение переменной z будет показывать, на какой тип данных //ссылается параметр a, что будет использоваться для корректного //приведения типа. if(z==1) < //Пользователь ввел 1, что означает целый тип данных. printf("%d", *(int*)a); //приведение к типу int > else if(z==2) < //2 соответствует символьному типу данных. printf("%c", *(char*)a); //приведение к типу char > else if(z==3) < //3 соответствует данным с плавающей точкой. printf("%f", *(float*)a); //приведение к типу float > >

При использовании void-указателей следует помнить, что для них недопустимы арифметические операции, как для типизованных указателей (см. врезку «Что такое указатель»). Пример:

void *ptr;
int a;
//Следующий оператор инкремента недопустим и приведет к ошибке при компиляции,
//потому что компилятор не получил никакой информации о том, на какую величину
//нужно изменить адрес, хранящийся в void-указателе. ptr++;

[Ссылки]

1. Introduction to pointers in C site:circuitstoday.com .
2. Void pointers in C site:circuitstoday.com .

Вывод из функции в c++

Всем здравствуйте, следующая проблема: У меня есть функция «showArray» она выводит случайные числа, я в «main» приписываю её, а как мне теперь увидеть сгенерированные числа? В main прописываю : cout

 #include #include #include using namespace std ; void generateArray(int *arr,int n); void showArray(int *arr,int n); int searchMin(int *arr,int n); int searchMax(int *arr,int n); void echangeMinMax(int *arr,int index_of_min,int index_of_max); void sortUpArray(int *arr,int n); void deleteEvenElements(int *arr,int &n); void moveLeftElements(int *arr,int n); int main() < int n; cin>> n; int *arr=new int[n]; generateArray(arr,n) ; showArray(arr,n); int index_of_min=searchMin(arr,n); cout void generateArray(int *arr,int n) < int a,b; cin>> a; cin>> b; srand(time(NULL)); for (int i=0;i void showArray(int *arr,int n) < for (int i=0;iint searchMin(int *arr,int n) < int index_of_min=0; for (int i=1;i> return index_of_min; > int searchMax(int *arr,int n) < int index_of_max=0; for (int i=1;iarr[index_of_max]) < index_of_max= i; >> return index_of_max; > void echangeMinMax(int *arr,int index_of_min,int index_of_max) < swap(arr[index_of_min],arr[index_of_max]); >void sortUpArray(int *arr,int n); < for (int i=0;iarr[i]) < swap (arr [i],arr[i]); >> 

Отслеживать
задан 14 ноя 2017 в 14:08
139 1 1 золотой знак 4 4 серебряных знака 17 17 бронзовых знаков
Вы пишете именно cout << showArray ? (тем самым выводите адрес функции showArray) 14 ноя 2017 в 14:14

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

int main() < int n; cin>> n; 
 int *arr=new int[n]; generateArray(arr,n) ; 

Ввели числа a и b и заполнили массив.

 showArray(arr,n); 

Вывели массив на экран.

 int index_of_min=searchMin(arr,n); cout 

Нашли и вывели индекс минимального значения

 int index_of_max=searchMax(arr,n); cout 
 echangeMinMax(arr,index_of_min, index_of_max); 
 showArray(arr,n); 

Опять вывели массив

Что вы еще хотите?

Еще раз его вывести? просто пишите, как и ранее -

 showArray(arr,n); 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *