Есть ли что-то, что я могу сделать в C, но я не могу сделать в C++?

Для этого вам нужно трипланарное картирование. Принцип заключается в том, что вы проецируете текстуру на плоскость XZ, как вы это делали, но затем вы также проецируете ее на плоскости ZY и XY. Наконец, вы используете нормаль поверхности (обычно квадрат многократно), чтобы смешать текстуры (умножить и сложить).

Вот как выглядит функция смешивания:

inline float3 TriplanarBlendFactor(half3 normal) {
    float3 bf = pow(abs(normal), 6);
    bf /= dot(bf, (float3)1);
    return bf;
}

Затем просто скомбинируйте образцы текстур следующим образом:

fixed4 cx = tex2D(tex, tx) * blendFactor.x;
fixed4 cy = tex2D(tex, ty) * blendFactor.y;
fixed4 cz = tex2D(tex, tz) * blendFactor.z;
fixed4 finalColor = cx + cy + cz;

Вы можете выставить мощность функции смешивания как шейдер свойство, если вы хотите контролировать расстояние смешивания.

12
задан yusuf 4 February 2009 в 19:58
поделиться

20 ответов

Можно редко инициализировать массивы в C. Мне нравится использовать его для отображения интервала-> sometype для относительно плотных статических карт, где неотображенное значение может быть интерпретировано как 0:

int my_array[] = { [1] = 3, [4] = 2 };
printf("%d %d %d\n", sizeof my_array, my_array[0], my_array[1]);
/* prints 20, 0, 3 */
4
ответ дан 2 December 2019 в 02:49
поделиться

Синтаксически существует несколько вещей, которые Вы могли записать в C, который не скомпилирует в C++ (См. Несовместимости Между ISO C и ISO C++ для мучительных деталей.). Если Вы спрашиваете в более высоком уровне, если существует некоторая программа, которую возможно записать в C, но не возможное записать в C++, то ответ является "Нет".

5
ответ дан 2 December 2019 в 02:49
поделиться

C++ испытывает недостаток в C99 restrict спецификатор. Поэтому нет никакого способа сказать компилятору выполнять оптимизацию, базирующуюся вокруг знания, что указатели не являются псевдонимами.

7
ответ дан 2 December 2019 в 02:49
поделиться

Существуют некоторые вещи, которые можно сказать в C, который Вы не можете в C++ (потому что C++ имеет более строгую проверку синтаксиса, и C имеет более обширный синтаксис 'прежней версии').

Кроме того, могут быть некоторые среды выполнения (O/S+library+compiler), которые поддерживают C, но не C++, таким образом, можно сделать C на тех платформах, где Вы не можете сделать C++.

6
ответ дан 2 December 2019 в 02:49
поделиться
int new = 0;

работы в C, но очевидно не может работать в C++, потому что 'новый' зарезервированное слово.

Существуют некоторые другие 'приемы' с зарезервированными словами, но кроме которого, можно в значительной степени сделать все в C, который можно сделать в C++.

10
ответ дан 2 December 2019 в 02:49
поделиться

В C можно создать литералы массивов ("соединяют литерал"), но в C++ Вы не можете

/* p points to the first element of an array of 4 int */
int *p = (int[]){1, 2, 3, 4};

Можно также создать массив с размером, еще не известным во время компиляции, но C++ не имеет такой возможности ("массив переменной длины"):

// create array. size is known at runtime only.
int p[rand() % 5 + 1];
16
ответ дан 2 December 2019 в 02:49
поделиться

... то есть все, что я могу сделать на C, но не на C ++.

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

OTOH, C ++ не является надмножеством C. В особенности C99 имеет некоторые функции, которых нет в C ++. Например. назначенные инициализаторы, массивы переменной длины в структурах и как автоматические переменные. В зависимости от вашего «чего угодно», это может быть то, что C ++ не может сделать, но C может.

20
ответ дан 2 December 2019 в 02:49
поделиться

Объявите переменную с именем 'class', например:

int class = 0;
43
ответ дан 2 December 2019 в 02:49
поделиться

Довольно много вещей. Например, на C вы можете написать такой код:

void * v = 0;
char * p = v;

и вы можете создавать такие массивы:

int main() {
    int n = 42;
    int a[n];
    return 0;
}

ни один из них не будет компилироваться под C ++.

6
ответ дан 2 December 2019 в 02:49
поделиться

C++ не поддерживает названную членскую инициализацию структуры, в C можно сделать:

структура {интервал x, y;} = {.x = 3};

Можно также объединить это с функцией, показанной Matt Havener:

структура {интервал [3], b;} w [] = {[0].a = {1}, 1.a [0] = 2};

0
ответ дан 2 December 2019 в 02:49
поделиться

Короткий ответ... не, не действительно. См. http://www.research.att.com/~bs/bs_faq.html#difference

1
ответ дан 2 December 2019 в 02:49
поделиться

Можно сделать почти все на любом из языков программирования. Конечно, способ выразить это будет варьироваться, а также объем кода, ясность кода, простота дальнейшего обслуживания. Некоторые задачи могут быть кодированы с немногими строками в Прологе и немногими страницами кода в C++ и так далее.

Некоторыми ограничивающими факторами являются доступные библиотеки, доступные компиляторы и проблемы низкого уровня. Однако, когда Вы рассматриваете C и C++ на типичном ПК, затем нет никакого различия в вещах, которые могут быть сделаны в любом из них.

Если, конечно, Вы не просили различия между C, и C++ - для этих других людей дали Вам идею.

2
ответ дан 2 December 2019 в 02:49
поделиться
char *c = malloc(sizeof(char));

допустимо в C, не C++ т.е. автоматически кастинге void*. Это, конечно - проблема синтаксиса, не так как, что Вы можете, и не может _do_ (т.е. выполните).

2
ответ дан 2 December 2019 в 02:49
поделиться

Это обращается к последнему стандарту C? Исходный C стандарт (ANSI 1989 или ISO 1990, с обновлениями 1995 года) справедливо близко к тому, чтобы быть подмножеством C++. Существуют различия, но они главным образом изобретены (самое большое исключение, вероятно, являющееся той пустотой *, преобразовывает свободно с любым указателем данных в C, но не в C++).

Однако новый стандарт C вышел в 1999, некоторое время после того, как я прекратил делать что-либо в самом современном C. Это имело новые возможности, некоторые из которых входят в стандарт C++, должный в этом году или затем, но не все.

1
ответ дан 2 December 2019 в 02:49
поделиться

В 'C' Вам не нужны предописания. Это позволяет Вам передавать параметры, которые интерпретируются неправильно. (Не то, чтобы это - замечательная особенность, но Вы не можете сделать этого в C++),

в файле A:

float sum(float a, float b)
{
   return a+b;
}

в файле B

main()
{
  printf("%f\n", sum(1,2));
}

с C это компилирует, но печатает 0.000

с C++ Вам нужен a float sum(float,float); перед printf, и это дает ожидаемый результат.

3
ответ дан 2 December 2019 в 02:49
поделиться

Стандарт C ++ 1998 г. содержит список несовместимости со стандартом C 1990 г. длиной 13 страниц (Приложение C). Конечно, это немного по сравнению с количеством страниц, описывающих языки, но все же охватывает немного земли.

Краткое описание перечисленных различий:

  • Добавлены новые ключевые слова (любая программа на C, использующая их в качестве идентификаторов, не является C ++)
  • Тип символьного литерала изменен с int на char (сравните sizeof ('a') в C и C ++!)
  • Строковые литералы сделаны const (не может сделать char * q = expr? "abc": "de"; )
  • «Предварительные определения» удалены из языка.
  • "Совместимые типы" удалены из языка.
  • Преобразование void * в любой другой указатель теперь требует преобразования.
  • Преобразование любого указателя const / volatile в void * теперь требует преобразования.
  • "Неявные объявления" удалены из языка.
  • Выражения больше не могут создавать новые типы (как в p = (void *) (struct x {int i;} *) 0; )
  • результаты некоторых выражений стали lvalue (сравните sizeof (0, arr) для char arr [100]; )

... это были первые 3 страницы приложения C.

Если вы перейдете к 1999 году Стандарт C, на описание различий уйдет вечность. Хотя C ++ 0x действительно включает некоторые функции C99, многие из них просто несовместимы по своей сути, например, сложный тип.

3
ответ дан 2 December 2019 в 02:49
поделиться

«Если это невозможно сделать на ассемблере, этого не стоит делать!»

хорошо, если не считать юмора, Я ДУМАЮ ОП спрашивает синтаксически, а не оперативно.

Я думаю, что есть несколько непонятных вещей, которые разрешены в C (по крайней мере, C89), но которые недопустимы в C ++ или, по крайней мере, устарели ... Но (если они существуют) они довольно неясны. C ++ функционально является надмножеством C.

0
ответ дан 2 December 2019 в 02:49
поделиться

На самом деле, я могу вспомнить один пример:

Когда вы создаете библиотеку (файл .lib или файл .dll) для совместного использования другими приложениями, вам лучше использовать C вместо C ++, потому что результаты более переносимы. Вы можете сделать это в компиляторе C ++, используя блок extern «C».

В частности, у C ++ есть особенность, заключающаяся в отсутствии стандартного соглашения по изменению имен - для преобразования сигнатур функций вашей библиотеки в имена более низкого уровня, используемые компилятором. Так, например, если у вас есть функция типа int addNumbers (int a, int b), разные компиляторы C ++ могут переводить эту функцию на разные имена, что может привести к проблемам, когда вы захотите импортировать библиотеку. Если вы используете компилятор C или окружаете библиотеку, импортирующую и экспортирующую код, блоком C, вы не увидите этой проблемы, поскольку существует только один способ изменить имена функций в C.

3
ответ дан 2 December 2019 в 02:49
поделиться

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

2
ответ дан 2 December 2019 в 02:49
поделиться

Очевидно, что C ++ не является надмножеством C по очень простой причине: в C ++ были добавлены новые ключевые слова
class, virtual, new и т. д. и поэтому больше не могут использоваться в качестве идентификаторов в C ++.

Некоторые причины более тонкие.
Вы можете найти исчерпывающий ответ на этот вопрос на сайте Бьярна Страуструпа: Язык программирования C ++ | Приложение B

0
ответ дан 2 December 2019 в 02:49
поделиться