LINUX.ORG.RU

А как на C решаются проблемы одной переменной на несколько типов?

 


0

2

Возник вопрос. Можно ли в C использовать переменную произвольного типа в зависимости от контекста? Пример кода.

void test(int type) {

 if (type==1) {
  char *data = "Hello world";
 }
 if (type==2) {
  int data = 123;
 }
// ...
}

Экспериментировал с void. Работает лишь наполовину

void test(int type) {

 void *data;
 if (type==1) {
  char *data = "Hello world";
  printf("Data: %s\n",data); // Тут data - правильные
 }
 if (type==2) {
  int data = 123;
 }
// ...
 printf("Data: %s\n",data); // А вот тут data - поломанные
}

Первый printf выводит как положено, Hello world.

А вот второй printf вне условия, выводит �ÐUH��H�� H�}�H�

Благодарю.

★★★★★
Ответ на: комментарий от X512

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

Я изучал sinclair васик, там не каша, а вингрет, тщательно прикленный к клавиатуре.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от X512

Программирование не имеет абсолютно никакого отношения к знанию конкретного ЯП.

Мой вопрос был про конкретный ЯП. Ну да, я его не знаю. Иначе бы сюда не обратился, что вполне логично.

Более того, статично-типизационный бред - абсолютно не влияет на программирование, разве что в области необходимости применения костылей для борьбы с неудобствами.

if (true) {int var = 1;}
printf("%d\n",var);

Undefined variable? Серьезно?

Я понимаю что это С-специфичный упоризм родом из 80хх, и он глубоко утвердился в языке и головах его изучающих.

Вот только не нужно называть это единственно верным способом ПРАВИЛЬНОГО программирования, а желание людей объявлять переменные (пусть даже и жестко типизированные) в рантайме - кашей в голове.

Поэтому у меня нет претензий. Ну нельзя и нельзя, значит возьму нормальный язык, где можно.

windows10 ★★★★★
() автор топика
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от hibou

Будь тише, видишь, человек нормальный язык вместо PHP освоить решил, а ты его своим снобским высокомерием сбиваешь с этого тернистого пути.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от windows10

Вот только не нужно называть это единственно верным способом ПРАВИЛЬНОГО программирования, а желание людей объявлять переменные (пусть даже и жестко типизированные) в рантайме - кашей в голове.

Дело в том, что что компьютер так физически устроен, что переменные статически типизированы. А вся эта динамическая типизация – это надстройка над родной статической, спрятанная от глаз программиста в коде рантайм библиотеки языка.

Без знания статической типизации не будет знания как на самом деле работает компьютер.

X512 ★★★★★
()
Ответ на: комментарий от X512

Смотря какой компьютер, есть и с динамическими типами, есть и с динамическими массивами. Ну и даже ассемблер x86 довольно «динамичный», можно изменять во время выполнения код, использовать память переменной как угодно, итд.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от windows10

Знаешь почему и дальше будут твои посты с жалобами на кривой Линукс и всратую сишечку? Ты даже не пытаешься понять, почему вещи, которыми ты пытаешься программировать, так устроены.

u-235
()
Ответ на: комментарий от X512

Дело в том, что что компьютер так физически устроен, что

Переменных там вообще нет - там запись в регистры, чтение с регистров, дергание памяти, дергание прерываний.

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

Раньше это имело смысл, потому что на проверку типа данных расходуются такты, и во времена сотнекилогерцовых процессоров с куцыми регистрами это всерьез било по производительности. С началом выпуска i286 - смысл пропал, ноль целых хрен десятых процента падения производительности - в пределах погрешности.

У нормального программиста, о котором вы мне пытаетесь намекнуть - каши в голове не будет, потому что он сам понимает и помнит, какую переменную для чего использует.

Поэтому вопрос не звучал как «С ущербный». Вопрос звучал как «можно или нельзя изящным решением». Ну все, изящным нельзя, будем C-стайлом - вообще не проблема.

И да, я - ненастоящий программист. Даже на PHP я не пишу, я придумываю примерный алгоритм, и ищу в справочнике как этот алгоритм можно организовать. Я даже синтаксис простого цикла for с закорючками не помню наизусть. Это не мой профиль. Я всего лишь написал работающий программный продукт, а настоящие программисты пусть пишут Wayland.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от u-235

Знаешь почему и дальше будут твои посты с жалобами на кривой Линукс и всратую сишечку? Ты даже не пытаешься понять, почему вещи, которыми ты пытаешься программировать, так устроены.

Ты удивишься, но я понял все что мне нужно. В том числе почему Си будут выкидывать из ядра.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

Undefined variable? Серьезно?

Я понимаю что это С-специфичный упоризм родом из 80хх, и он глубоко утвердился в языке и головах его изучающих.

переменная определяется в блоке {…}, вне блока она не просто не видна, но даже ее физическое место(на стеке) может быть распеределено компилятором под другую переменную.

это правильно и удобно. сделано для локальности кода, исходя из принципа - область видимости переменной должна быть минимальной, и она должна быть определена максимально близко к точке использования.

то есть

int x = 100;
if (...) {int x = 200; ...}
else {int x = 300; ... }

тут три разные переменные, причем две последних имеют один адрес (ну если компилятор не совсем тупой).

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от windows10

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

И да, пишуших на си и не знающих его уже более чем достаточно. Не надо понижать планку до совсем уж абсурдного.

anonymous
()
Ответ на: комментарий от X512

Там просто наборы битов, можно просто взять и(в некоторых пределах) со случайного адреса загрузить в регистр что попало и потом этот регистр любой инструкции передать, целочисленной, фпу, битовой и тд в любом порядке.

anonymous
()
Ответ на: комментарий от anonymous

Сколько ни читаю про динамическую типизацию, не оставляет чувство ограниченности этого подхода. Может быть этого достаточно для каких-нибудь плюшевых языков, детских и даже удобно для коротких скриптов на пару строчек. Но не для больших программ.

Какого фига я не могу в питоне сложить число и строку? А число и символ могу? А ведь символ — тоже число. Тогда какого чёрта?! А бул могу с числом сложить? Какого фига я не могу складывать числа? Оно всё — числа.

Да и языки с этой вашей динамической типизацией обычно имеют ограниченный набор типов. В си одних только интов вооон сколько.

hibou ★★★★★
()
Ответ на: комментарий от anonymous

Только в таких фразах почему-то умалчивают о причинах. Волк не выступает в цирке вовсе не из-за своей непомерной крутости. А из-за того, что трудно обучаем. Близко к необучаем вовсе.

У волка очень много заложено инстинктивного. И что идет вразрез с инстинктами, то для него сложно и страшно. А страх его выливается в агрессию. Поэтому с волком трудно работать.

Однако прецедент был. Волк выступал в цирке. И это колоссальная победа как волка, так и людей, которые его обучали. Но это очень сложно, неоправданно сложно. Поэтому больше за работу с волком никто не берётся.

Большие кошки обучаемы. Котята рождаются менее связанными инстинктами. Они всё пробуют сами, получают жизненный опыт. И более того, им нравится изучать новое. И нравится выступать. Для льва похвала перед львицами важна. Попробуй погладь другого льва, не его, он обидится. Выступление для них что-то вроде — гляньте как я могу.

hibou ★★★★★
()
Ответ на: комментарий от windows10

Фигнёй страдаешь, идеальный язык для тебя Go, это учитывая и твой уровень и задачу (DE вроде), а то эти нелепые метания - PHP не умеет в системщину, а в Си не умеешь ты, ну и смысла нет на си сейчас что-либо начинать

zurg
()
Ответ на: комментарий от windows10

Программирование не имеет абсолютно никакого отношения к знанию конкретного ЯП.

К сожалению, имеет, и ты только что это доказал своим топиком. Не зря ещё бородатые говорили «программист на Фортране программирует на Фортране на любом языке». Программист на Питоне, как уже выше отметили, как и программист на Бейсике - это диагноз, обычно болезнь неизлечима.

VIT
()
Ответ на: комментарий от yars068

А еще, typeof же, нет?

Ржака:

void foobar(void* parameter);

int a = 42;
foobar(&a);
struct mytype b{};
foobar(&b);

void foobar(void* parameter) {
// Что вернёт здесь typeof(parameter)?
// Подсказка - информация о типах в машинных кодах не присутствует, особенно в C.
}
her_s_gory ★★
()
Ответ на: комментарий от windows10

Я изучал sinclair васик, там не каша, а вингрет, тщательно прикленный к клавиатуре.

Там это считай shell был. Для скриптов, чтобы уже загружать и запускать нормалиные программы в машинных кодах через RANDOMIZE USR(address)

В этом плане привязка к клавишам было полностью оправдана.

her_s_gory ★★
()
Ответ на: комментарий от X512

Дело в том, что что компьютер так физически устроен, что переменные статически типизированы.

Компютер физически так устроен, что он оперирует только числами. Числа - это и команды и данные. А как мы хотим относиться к этим числам - это уже языки програмирования, которые к физическому устройству компютера имеют сильно косвенное отношение.

Вот это и называется кашей в голове.

her_s_gory ★★
()
Ответ на: комментарий от windows10

Области видимости к типизации отношения не имеют. К переменной объявленной внутри блока, вообще мало какой язык может обратится, тут PHP скорее исключение, вместе с Raku.

Вот только не нужно называть это единственно верным способом ПРАВИЛЬНОГО программирования

Думаешь ты кого то этим переубедишь? «Эксперты» готовы за отступы порвать, а ты на основы наезжаешь.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от X512

Я вижу ты Дейкстру цитируешь, значит возможно уважаешь его мнение. Он писал что начинать с Haskell хорошая идея, так как мышление не будет привязываться к машинному стилю, что по его мнению хорошо. Почему именно хорошо, он точно не написал, но подозреваю что дает возможность смотреть выше битов, и не застревать в размышлении над низкоуровневыми деталями.

Думаю это вызывает конфликт между твоими комментариями, в одной ты против Python, в другом против BASIC потому что так сказал Дейкстра, аргументиря это своими убеждениями, которые выливаются в пользу изучения Haskell.

Я с Дейкстрой не согласен, вообще. Изучение с самых низов это очень хорошо, но обязательно нужно изучать необычные архитектуры, иначе можно подумать что x86/ARM/RISC-V это единственный путь и по другому быть не может. Почему бы не рассмотреть троичные компьютеры, десятичную арифметику вместо двоичной, систему остаточных классов, аналоговые вычисления, дополнение до одного, теггированную память, аппаратную транзакционную память, безрегистровые архитектуры, No instruction set computing, итд.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 6)
Ответ на: комментарий от hibou

не могу в питоне сложить число и строку?

А что должно было-бы получиться по-вашему в результате такой операции?

А бул могу с числом сложить?

Можете. Буул — подмножество целых чисел, соответственно, автоматически кастуется в целое.

thunar ★★★★★
()
Последнее исправление: thunar (всего исправлений: 2)
Ответ на: комментарий от hibou

динамическую типизацию

Профит есть от динамического управления объектами (да и в целом памятью) и переменыыми.
И это скорее удел системного API, а не прикладных алгоритмов.
Хотя "я вам не скажу про всю Одессу. Вся Одесса очень велика …. «Но и молдаванка и переса уважали ООП - …»

anonymous
()
Ответ на: комментарий от thunar

Про строки, я думаю, что эта конструкция – абстракция над базовым типом данных. Строка – некая последовательность чисел. Правильно?

Так вот в моем понимании (не спорю, может быть искаженном некоторым моим жизненным опытом) в сам язык не надо закладывать такие жесткие абстракции верхнего уровня, как всякие строки, списки, массивы. Ну зачем? Это дело библиотек верхнего уровня. Может быть даже сторонних.

Язык должен позволять делать операции над числами. Всё. А уж что представляют собой последовательности чисел, шерифа вообще колебать не должно. Кроме операций над числами, язык должен позволять создавать свои типы данных и определять операции над ними. С этой стороны мне нравится С++. Там изначально строк не было. Сначала каждый писал свой класс строк. Позже класс добавили в STL.

В Си тоже нет строк. Это просто массивы чисел. Ты можешь сложить число с любым байтом представляющим строку.

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

hibou ★★★★★
()
Ответ на: комментарий от hibou

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

В 1С это так:
«1» + 1 - результат «11»;
1 + «1» - результат 2.

anonymous
()
Ответ на: комментарий от hibou

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

Это в колхозе строки «складывают», тут правильное название - конкатенация. Которая вообще не сложение, а приписывание в хвост одной последовательности другой последовательности.

То есть сложить строки как числа нельзя, это операция совсем другой семантики. И что такое «сложение» чисел со строками - непонятно. Верней, каждый трактует как хочет, если собрался это делать.

alysnix ★★★
()