C言語なら俺に聞け( ..
[2ch|▼Menu]
697:デフォルトの名無しさん
09/10/22 12:18:59
>>696
void func2(const Kouzoutai * parameter);
func2()自体が書き換え可能なのだとしたら、呼び出すこと自体が無茶。

698:デフォルトの名無しさん
09/10/22 12:23:49
func()
{
  Kouzoutai kouzoutai;
const Kouzoutai *kouzoutai_constptr = &kouzoutai;

  kouzoutai.member = 100;
  func2(kouzoutai_constptr);
}

699:デフォルトの名無しさん
09/10/22 12:38:38
C++でも
func(const T &in, const T &in2, T *out) //定義
func(in, in2, &out) //呼び出し
みたいにして、呼び出しの記述を見て関数内で変更されうることが類推しやすくしたりするね

そういう意味では
func2((const Kouzoutai *)&kouzoutai)
でいいのかも知れんが、全部それやらないと本末転倒

700:デフォルトの名無しさん
09/10/22 13:11:12
値渡しでいいだろ。速度も落ちねえよ。

701:デフォルトの名無しさん
09/10/22 13:38:47
なんでそんな無茶を言い出すの

702:デフォルトの名無しさん
09/10/22 15:14:48
無茶ではない。
値渡しこそ正義。

703:デフォルトの名無しさん
09/10/22 17:42:25
参照渡しがいいの!

704:デフォルトの名無しさん
09/10/22 17:54:44
値渡しだろ

705:デフォルトの名無しさん
09/10/22 18:01:02
間を取って、コピーしたもののアドレスを渡す、でどうか

706:デフォルトの名無しさん
09/10/22 18:08:33
とるなし

707:デフォルトの名無しさん
09/10/22 21:47:21
fuck()

708:デフォルトの名無しさん
09/10/22 21:52:38
>>698
なるほど。天才ですね。

709:デフォルトの名無しさん
09/10/22 22:09:02
よく言われる

710:デフォルトの名無しさん
09/10/23 01:34:00
いつも神様って呼ばれてる。天才と言われることは滅多にない

711:デフォルトの名無しさん
09/10/23 10:56:55
いつも旧神って呼ばれてる。ノーデンスと言われることは滅多にない

712:デフォルトの名無しさん
09/10/23 12:15:02
神様にもいろいろいるしね
貧乏神や疫病神でないことを祈る

713:デフォルトの名無しさん
09/10/23 12:30:38
死神だろ。

714:デフォルトの名無しさん
09/10/24 10:26:40
func()
{
  Kouzoutai kouzoutai;

  kouzoutai.member = 100; //func()では書き換えたい
  func2(&kouzoutai); //func2()では書き換えたくない。関数呼び出しからそれを明記できないか。
  kouzoutai.member = 100; //func()では書き換えたいんだってば
}


715:デフォルトの名無しさん
09/10/24 10:40:45
 func2(kouzoutai); //func2()で書き換えても平気。値渡しだから。call by valueだから。

716:デフォルトの名無しさん
09/10/24 13:21:32
return fuck(you);

717:デフォルトの名無しさん
09/10/24 15:36:03
メイン関数でポインタを宣言し、関数Aに引数でポインタを渡し動的にメモリを確保するとともにデータをセット
次に関数Bでそのデータを処理、みたいな事をしたいのですがうまくいきません。
どうも関数Aで確保したメモリがmainに戻ってくると解放されているようす・・・なにか方法はないですか?

void main(void)
{
  char *p;

  関数A(p);
  関数B(p);
}

void 関数A(char *p)
{
//ここで*pに動的メモリを割り当て&データセット
}

void 関数B(char *p)
{
//*pのデータを処理
}


718:デフォルトの名無しさん
09/10/24 15:39:29
動的にメモリを割り当てられてないんでしょ。

719:デフォルトの名無しさん
09/10/24 15:41:22
>>717
void 関数A(char **p)

じゃないと p@main が書き換わらないよ

720:デフォルトの名無しさん
09/10/24 15:45:57
そしてmain内では
関数A(&p);
にする

普通の変数を関数内で書き換えるときと同じ。

721:デフォルトの名無しさん
09/10/24 16:05:42
こうしろ。

void main(void)
{
  char *p;

  p = 関数A();
  関数B(p);
}

char *関数A(void)
{
//ここで動的メモリを割り当て&データセット
}

void 関数B(char *p)
{
//*pのデータを処理
}


722:717
09/10/24 16:14:34
ありがと書き換えてみるわ

723:toya
09/10/24 17:01:57
>>503
よろしくおねがいいたします。

724:デフォルトの名無しさん
09/10/24 17:28:44
>>723
インデントを説明するための例なので、内容については説明しません
int foo(){return 0;}
int bar(){return 0;}
int main(){int a,b;for(a=0;a!=5;a++){b=((b+a)*b+a)/a;foo();bar();}return 0;}

せめてバグがない物を提示しないか

725:デフォルトの名無しさん
09/10/24 17:29:59
上のプログラムはコンパイラに掛けると、エラーはなく実行できるコードを返してくれます。

と続いてるわけだし。

726:デフォルトの名無しさん
09/10/24 18:07:45
>723
多くの人によって編集されていくと、スタイルがバラバラになる可能性があるので、
最低限は決めておいた方がいいと思う。
また、説明などに使う用語やどの規格に準拠して書くかなども。

これ以上はスレチなので、新しくスレを立ててからお願いします。

727:デフォルトの名無しさん
09/10/25 04:03:48
free() や fclose() に NULL を渡したらどうなりますか?

728:デフォルトの名無しさん
09/10/25 04:18:37
どうもならない。

729:デフォルトの名無しさん
09/10/25 04:30:29
>>727
fclose に NULL を渡すのはダメ

730:デフォルトの名無しさん
09/10/25 14:55:59
「車輪の再発明はするな」という言葉で車輪の再実装を阻む行為は、
「車輪を実装した」という経験をもたせないようにして、先行者利益を確保するという、孔明の罠なのです。

731:デフォルトの名無しさん
09/10/25 15:05:44
車輪の調子が悪い時にメンテナンスできないしな

732:デフォルトの名無しさん
09/10/25 15:40:14
実装の仕方がまちがっているのに得意げな車輪の再実装は
止めてやるべき

733:デフォルトの名無しさん
09/10/25 15:44:35
自作の暗号アルゴリズムほど恐ろしいものはない

734:デフォルトの名無しさん
09/10/25 15:47:33
実験を一人でやれない奴は発明するな

735:デフォルトの名無しさん
09/10/25 15:52:50
日本に航空機製造をさせない某国のような

736:デフォルトの名無しさん
09/10/25 16:17:07
再発明と再開発・再生産とは違う。
発明するのが無駄ってことだろ。


737:デフォルトの名無しさん
09/10/25 16:19:56
孔明の罠??


738:デフォルトの名無しさん
09/10/25 16:45:53
やらない言い訳に使うなってことでもあるな。
ありもしないライブラリを再発明になるといけないので探してます、とかな。

739:デフォルトの名無しさん
09/10/25 17:24:10
>>737
巧妙なトリック

740:デフォルトの名無しさん
09/10/25 17:39:11
光明の罠

741:デフォルトの名無しさん
09/10/25 18:13:11
あなたに自分の好きなことをする自由な時間を取り戻す20の方法
URLリンク(gigazine.net)

10.「それは受けられません」と言うことを学びなさい
12.最も大きなタスクを一番最初に処理しなさい
13.人に任せる
14.気を散らすあらゆるものを視界から取り除きなさい
15.インターネットから切断する
16.外部委託する


742:デフォルトの名無しさん
09/10/25 18:50:31
>>737
げぇ!

743:デフォルトの名無しさん
09/10/25 19:55:57
1. その本を閉じる
2. 2chviewer をアンインストールする


744:デフォルトの名無しさん
09/10/26 02:48:27
方向キー押すと1づつ大きくなるカウンタってどうやって作りますか?
押している間じゃないです
お願いします

745:デフォルトの名無しさん
09/10/26 03:03:15
処理系依存

746:toya
09/10/26 06:15:16
>>726

準拠する規格は『JISX3010:2003 プログラム言語C』で
URLリンク(www.jisc.go.jp) 」→「JIS検索」→
「JIS規格番号からJISを検索」で「X3010」と入力し
「一覧表示」→「JISX3010」→「規格の閲覧」で閲覧できます


747:デフォルトの名無しさん
09/10/26 06:27:28
c99かよ

748:デフォルトの名無しさん
09/10/26 11:04:50
int func(){
 for(;;){
 }
 return 0;
}

こういうスタイルって、紙の本で行数が間延びしないためのものだろ。
実機での記述でこのスタイルにしてる奴って、それを理解してないんじゃないのか?


749:デフォルトの名無しさん
09/10/26 11:14:43
昔の画面全体で25行しか無い時も有効だったかもな。

750:デフォルトの名無しさん
09/10/26 11:18:30
FDD全盛のころは改行コードすらもったいなかったんだよ

751:デフォルトの名無しさん
09/10/26 11:53:35
>>748
ディスプレイで見たときにも間延びするとかっこわるい。

752:デフォルトの名無しさん
09/10/26 12:03:07
詰まってる方がかっこわるいだろ

753:デフォルトの名無しさん
09/10/26 12:34:43
int foo(int n, int m)
{
  int i, j, k, something;

  for ( i = 0; i < n; ++i )
    if ( i != m ) {
      (void)something;
      for ( j = 0; j < n; ++j )
        for ( k = 0; k < n; ++k ) {
          (void)something;
          if ( k != m )
            (void)something;
          {
            int a, b;
            (void)(something = a + b);
            (void)something;
          }
        }
    } else
      (void)something;
  (void)something;

  return 0;
}

関数化しろとかインデントが2カラムと言うのは無しで、こういうソースはできれば見たくない

754:デフォルトの名無しさん
09/10/26 12:36:40
>>753
見なきゃいい
エディタ起動時に必ず整形ツールを通すようにすればいいだけだ

755:デフォルトの名無しさん
09/10/26 12:38:01
この形に美しさを感じられない奴は
コンピュータプログラミングには向いていないよ。

756:デフォルトの名無しさん
09/10/26 12:43:13
>>753
別に悪くないと思うが。
じゃあどんなスタイルが良いんだ?

定番で悪いが
Linux流プログラム書法
URLリンク(www.linux.or.jp)

757:デフォルトの名無しさん
09/10/26 12:51:07
プログラムの途中でコアを吐く?のだけど、そんなエラー見たことないし、
調べても何か特定の原因があるってわけでもなさそうなのでさっぱり意味がわかりません。
一つ一つの処理ごとにprintfを挟んでみたところ以下のようでした。

#define _XOPEN_SOURCE

#include <stdio.h>
#include <string.h>
#include <unistd.h>

main(void)
{
int i, j, len;
unsigned char tripkey[11] = "";
unsigned char salt[3] = "";
unsigned char trip_f[256] = "";
unsigned char trip[11] = "";

printf("トリップキーを入力:");
scanf("%u", &tripkey);

printf("トリップキー入力"); ←これが表示されずにコアを吐く

758:デフォルトの名無しさん
09/10/26 12:54:03
>>757
> scanf("%u", &tripkey);

scanfの使い方調べろよ

759:デフォルトの名無しさん
09/10/26 12:54:36
>>753
Java見たいで嫌だ書き直す
int foo(int n, int m){
  int i, j, k, something;

  for(i = 0; i < n; ++i){
    if(i != m){
      (void)something;
      for(j = 0; j < n; ++j){
        for(k = 0; k < n; ++k){
          (void)something;
          if(k != m) (void)something;
          {
            int a, b;
            (void)(something = a + b);
            (void)something;
          }
        }
      }
    }else (void)something;
  }
  (void)something;
  return 0;
}
漏れが許せる隙はこれが限界だ

760:デフォルトの名無しさん
09/10/26 12:54:48
制御にくっつく単文でもブレースで括ってくれと言いたかったんだ
ブレースだけの行があるのが嫌な人もいるんだろうけどね
もう慣れているからどちらでもいいんだけど、修正時のエンバグ対策に{}付けていた体質を改めようかな、はっはっはぁ

761:デフォルトの名無しさん
09/10/26 13:00:43
>>753
インデントついてるからまだましだけど
その書き方でインデントめちゃくちゃなやつもいた

if(k != m) (void)something; {
  int a, b;
  (void)(something = a + b);
  (void)something;
  }

とかもう

762:デフォルトの名無しさん
09/10/26 13:10:11
関数は

int
foo(int n, int m)
{
}

って書く方が好みだ。
関数名を検索するときに、/^foo\(/でジャンプできるからな。
'{'を独立した行に置くのは、K&R第1版の頃の
foo(n, m)
 int n;
 int m;
{
}
からの慣れかな。

763:デフォルトの名無しさん
09/10/26 13:13:37
>>753
他人が読むことを想定していないコードだな

764:デフォルトの名無しさん
09/10/26 13:14:21
>>763
具体的にどこがそうなのか挙げてみれ

765:デフォルトの名無しさん
09/10/26 13:16:07
スタイル議論してるスレがあるはず。

766:デフォルトの名無しさん
09/10/26 13:16:56
関数は

/*!
 * @brief fuga
 *
 * hoge
 *
 * @return piyo
 */
int
foo(
    int n, /*!< [in] bar */
    int m /*!< [in] baz */
) {
}

って書く方が好みだ。
ただの似非Doxygenスタイルだけど。

767:デフォルトの名無しさん
09/10/26 13:17:47
>>764
わかってるくせに

768:デフォルトの名無しさん
09/10/26 13:18:59
>>759
Java みたいなのはお前の方だw

769:デフォルトの名無しさん
09/10/26 13:20:59
int foo(int n, int m){
int i, j, k, something;

for(i=0; i<n; ++i){
if(i != m){
(void)something;
for(j = 0; j < n; ++j){
for(k = 0; k < n; ++k){
(void)something;
if(k != m)
(void)something;{
int a, b;
(void)(something = a + b);
(void)something;
}
}
}
}
else
(void)something;
}
(void)something;
return 0;
}


770:デフォルトの名無しさん
09/10/26 13:23:52
>>767
>>753は、非難されるほどひどいスタイルには見えん。
ひどい点があるなら、教えてくれないか

771:デフォルトの名無しさん
09/10/26 13:26:58
>>770
全角スペース

772:デフォルトの名無しさん
09/10/26 13:28:11
スタイルじゃなくて、これが紛らわしいってこと

if ( k != m )
(void)something;
{
int a, b;
(void)(something = a + b);
(void)something;
}


773:デフォルトの名無しさん
09/10/26 13:29:38
if ( k != m ){
  (void)something;
}
{
  int a, b;

  (void)(something = a + b);
  (void)something;
}

774:デフォルトの名無しさん
09/10/26 13:31:01
#define BEGIN do{
#define END }while(0)

if ( k != m ){
  (void)something;
}
BEGIN
  int a, b;

  (void)(something = a + b);
  (void)something;
END;

775:デフォルトの名無しさん
09/10/26 13:32:17
>>771
htmlでインデントを表現するために、わざと全角空白をつかってるんじゃないか?

776:デフォルトの名無しさん
09/10/26 13:36:39
>>775
 
使え

受け取った方がコピペでコンパイル出来るようになる

777:デフォルトの名無しさん
09/10/26 13:54:13
>>775
&nbsp;
使え

消えてたorz

778:デフォルトの名無しさん
09/10/26 14:02:01
&amp;を忘れたのねw

779:デフォルトの名無しさん
09/10/26 14:10:58
>>776
一部の専ブラでは書き込まれた&nbspをコピペすると化ける。


780:デフォルトの名無しさん
09/10/26 14:12:27
>>758
なんだかよくわからなかったのでgetsを使ってみたけれどそれでもダメでした

781:デフォルトの名無しさん
09/10/26 14:13:57
なんだかよくわからないものをなんだかよくわからないまま使っても
なんだかよくわからない結果にしかならないと思うんだ

782:デフォルトの名無しさん
09/10/26 14:23:26
>>780
scanfのフォーマット指定子とそれに対応する引数を考えてみて。
つかあまりにも適当に指定してるようにしか見えないから、
正解をズバリ書くのもはばかられるわ

783:デフォルトの名無しさん
09/10/26 14:47:18
>>782
%sと%cを試してみたけど変わりませんでした


784:どちらが正統?
09/10/26 14:58:45
char s[6]="INTEL";
sは長さ6の文字列へのポインタで、その値は変更不能な文字列
(リテラル)"INTEL"を指すポインタ値

なのか

sは長さ3の文字列へのポインタで、その値は変更可能な文字配列
を指すポインタ値で、変更可能な文字列配列はあらかじめ
コンパイラによって変更不能な文字列"INTEL"を複製したもの
が設定されている。

785:デフォルトの名無しさん
09/10/26 15:03:19
>>783
へぇ

786:デフォルトの名無しさん
09/10/26 15:19:05
>>784
どちらも間違い。 sはポインタではなく配列

787:どちらが正統?
09/10/26 16:20:53
char s[7]="foobar";

sは長さ7の変更不能な文字配列である"foobar"の名前である

のか

sは長さ7の変更可能な文字配列で(コンパイラにより)
変更不能な文字配列(リテラル)"foobar"の複写で初期化された
ものの名前である。

788:デフォルトの名無しさん
09/10/26 16:29:32
PHPをかなりやってきて、
プログラミングの基本とか
だいたい理解したと思うので
そろそろCをはじめようかと
思うのですが、Cをはじめる
前に、これを先にPHPで勉強
しておいたほうがいい、
っていうの、何かありますか?

一応、PHPで、

print文で画面に文字とかを出力、表示する

ifでの分岐
switch文での分岐

for、while、foreachでのループ

ユーザー定義関数
関数への値渡し、引数渡し

includeで他のファイルを読み込んで使う

配列、連想配列(ハッシュ)

ファイルへの読み書き

OOP基礎
----------------------------------------------
↑こんくらいはマスターしました。
Cに移行する前に、何かもっと
勉強しておいたほうがいい知識はありますか?

789:デフォルトの名無しさん
09/10/26 16:30:35
別に真っ白な状態からCを学んでも良いと思うけど。

790:デフォルトの名無しさん
09/10/26 16:34:11
>>788
PHP→Cは結構苦労するってなんかの本に書いてあったな
逆にC→PHPは3日で覚えられるって事も

791:デフォルトの名無しさん
09/10/26 16:37:48
PHPで、

セッションやら、
クッキーやら、
サニタイズやら、
BASIC認証やら、

やらされたので、Cだと
そういうのないので、
かえって勉強しやすいかなー
と思ってます。

792:デフォルトの名無しさん
09/10/26 16:40:33
>>787
後者。
でも「変更不能な文字配列(リテラル)"foobar"の複写で」がなんか違和感あり。

char s[6] = "INTEL";
は、
char s[6] = {'I', 'N', 'T', 'E', 'L', 0};
と全く同じよ。

793:デフォルトの名無しさん
09/10/26 16:51:19
リテラルの複写とは全く違うから後者も間違いだろw

794:デフォルトの名無しさん
09/10/26 16:54:29
>>783
引数もちゃんと考えようぜ。
例を見て&つけてるんだろうけど、何で&がついてるかわかるか?
配列の[]無しはどういうものかも。

795:デフォルトの名無しさん
09/10/26 17:06:55
>>791
C-CGI作るならもちろんその辺もやらないとだめだよ

796:デフォルトの名無しさん
09/10/26 17:09:37
CでCGIなんか作るわけねーだろ。あほか?
USBで外部デバイスを接続して
パソコンでプログラム組んで
ROMライターで焼いて、、、
ってやるんだよ。

お掃除ロボットのルンバの
プログラム組んだりとか
ロボット作ったりとかしてーんだよ。

空気よめよwww

797:デフォルトの名無しさん
09/10/26 17:44:30
Cのコンパイラーは
どっからダウンロードするんにゃ〜〜

おしえれ〜〜

798:デフォルトの名無しさん
09/10/26 17:45:57
2chのread.cgiはcだそうだ

799:デフォルトの名無しさん
09/10/26 17:55:47
>798
どっかのFlashで見たなそういえば、
zlibとか使って圧縮して通信容量減らして危機を救ったとかなんとか

十分慎重に組めばセキュアなCGIも作れるわけだが
CでCGI作るというウェブサイトや書籍にろくなものが無い気がしないでもない

800:デフォルトの名無しさん
09/10/26 18:05:38
文字解析以外はCもperlのようなものも一緒でしょ
というか、2chのC化自体はあまり効果が無かったような

801:デフォルトの名無しさん
09/10/26 18:10:22
2chブラウザのおかげね。

802:デフォルトの名無しさん
09/10/26 18:59:07
今はむしろ2chブラウザのせいで通信量が増えてるわけだが

803:デフォルトの名無しさん
09/10/26 19:26:03
どうして?

804:デフォルトの名無しさん
09/10/26 19:39:48
>>803
タブをたくさん開きーのそいつらをいっせいにリロードしーの
あまつさえ自動でリロードしーの

805:デフォルトの名無しさん
09/10/26 19:44:08
多くの専ブラはそれの対応したはずだが

806:デフォルトの名無しさん
09/10/26 19:57:13
対応といっても更新間隔に制限を設けただけだからな
100タブ単位で開いてると馬鹿にならない

807:デフォルトの名無しさん
09/10/26 20:20:00
それって専ブラの起因した問題じゃないと思うが

808:デフォルトの名無しさん
09/10/26 20:24:17
というか量増えちゃだめなの?PCの能力あがったんだからたくさんの情報をロードできるから仕方ないじゃん。


809:デフォルトの名無しさん
09/10/26 20:25:09
人間の能力はあがってないだろ

810:デフォルトの名無しさん
09/10/26 20:27:51
読もうとしてないスレもリロードしたりするじゃん。
なのにそのスレ読むときにまたリロードしたりして。
専ブラに起因した問題じゃないってのはタブ型ブラウザのことでも指してるのかなぁ

811:デフォルトの名無しさん
09/10/26 20:29:46
あれはリロードじゃなくてDATの量を見てるだけだし読むときは差分だけだし
なにか勘違いしてない?

812:デフォルトの名無しさん
09/10/26 20:31:23
URLリンク(f30.aaa.livedoor.jp)
昔話

813:デフォルトの名無しさん
09/10/26 20:31:28
なら転送量は増えないの?

814:デフォルトの名無しさん
09/10/26 20:40:01
いま仕様みてきたけど、次回dat読み込むときは
HTTPリクエストヘッダに
Range: bytes=

で差分を指定できるみたいだね。(この場合は gzip 圧縮はされない)

ただ、リクエストしまくるとバーボン規制やボボン規制を食らう可能性もある。

815:デフォルトの名無しさん
09/10/26 20:40:24
説明するのは面倒なので URLリンク(monazilla.org) の資料でも読んでください

816:デフォルトの名無しさん
09/10/26 21:42:38
URLリンク(kansai2channeler.hp.infoseek.co.jp)

実行して出力したときに、
countを1000にするとうまく表示されるのですが、
countを100にしたときに、どうして壁を突き破るのか教えてください。
また、100にしても壁を突き破らない方法を教えてください。



817:デフォルトの名無しさん
09/10/26 22:01:03
>>792
char s[]="書き換えてはならない文字列";
s[2]='¥0';

この場合コンパイルは通る?動作は保証される?

818:デフォルトの名無しさん
09/10/26 22:13:19
>>817
大丈夫
保証される

819:デフォルトの名無しさん
09/10/26 22:39:18
>>817
解釈ルール上からは大丈夫な筈であるが
char *s="書き換え禁止文字列";
とかと混同使用されている現実から安全対策の為、
強く警告を出して事実上禁止している処理系が
多いのでやらないほうが良い。

820:デフォルトの名無しさん
09/10/26 22:45:52
>>819
そんなのがあるとは…
ちなみに処理系の名前を教えて欲しいです

821:デフォルトの名無しさん
09/10/26 22:57:47
>>819
混同してるのも安全対策が必要なのもてめーだけだ
何を禁止or警告されているかくらい読めぼけ

822:デフォルトの名無しさん
09/10/26 23:06:02
VC++2008で見てみたけど、警告レベル最高でもべつに警告はでなかった。

823:デフォルトの名無しさん
09/10/26 23:10:19
>>822
>>817 の時点ではおkだが、>>819 が痛いんだよ

824:デフォルトの名無しさん
09/10/26 23:16:37
リテラルに関しては特別である件について

int array[]={0,1,2,3,4,5,};
の要素がLValueになれない処理系はモグリだが
char array[]="012345";
の要素がLvalueになれない処理系がモグリだと
決めつけられないとオモ
char array[6]="012345";
でLValue禁止はモグリだが

825:デフォルトの名無しさん
09/10/26 23:18:10
>>824
そういう処理系がある可能性もあるから
名前が知りたいだけですよ

826:デフォルトの名無しさん
09/10/26 23:20:33
GCCやらVCみたいなメジャーなやつで警告でないなら、べつに気にしない。

827:デフォルトの名無しさん
09/10/26 23:20:49
>>824
> 決めつけられないとオモ
何が「特別」なのかどう頑張っても足掻いても完璧にわかってないな

828:デフォルトの名無しさん
09/10/26 23:32:44
char s[]="12345"
がconst char s[6]={'1','2','3','4','5',0}と
等価だって保証されてる?

829:デフォルトの名無しさん
09/10/26 23:35:06
>>828
constはつかないんじゃないの?

830:解説
09/10/26 23:49:59
>>824とか
リテラル表現を見つけるとCコンパイラは機械的にそれを
void *型のconst ポインタ値に置換するというウワサ
(void*)の(char*)のキャスト省略は認容されているからprintfとかに
与えても文法上合法だし、その処理系に付属しているライブラリ関数
ならば期待した動作をする。

問題はvoid*が指しているアドレスに実際に何が書かれているかに
ついての規定が不可能になってきていること。
エンコーディング(フォントの種類とかサイズランク
(微妙に書体が変わるんで)まで規定できる新しいコード体系とか)
によっては連続したメモリ領域にマップしないほうが良い場合もあり
得るし実際しないだろうし。
そいった状況になったらchar s[]="うんたらかんたら";
がchar s[]={ 文字配列要素定義列 };
という解釈をしてもらえるという保証が無くなる可能性がある

831:デフォルトの名無しさん
09/10/26 23:52:37
Cの規格上ではつかないよ。

char s[]="12345"; は左辺のために新たに確保された領域に
右辺の値がコピーされるから、つける必要もないし。

832:デフォルトの名無しさん
09/10/26 23:56:35
>>830
そういうヘボい実装をしている処理系を知っているなら教えて欲しい
○○向け○○コンパイラとか

833:デフォルトの名無しさん
09/10/26 23:57:07
あ、ちなみに処理系よってはANSIやJIS規格に従わないコンパイラなんていくらでもある。
だから、>>819>>824はその処理系の名前を具体的にあげてくれればいい。
それだけで話は終了する。これは一般論じゃないから。

834:デフォルトの名無しさん
09/10/26 23:59:02
特定の文字エンコーディングに依存する実装のほうがヘボい
だろ。Cの現状的には

835:デフォルトの名無しさん
09/10/27 00:06:57
>>830
そもそも
> char s[]="うんたらかんたら";
> がchar s[]={ 文字配列要素定義列 };
> という解釈をしてもらえるという保証が無くなる可能性がある
char s[] = "うんたらかんたら";

char s[] = {'う', 'ん', 'た', 'ら', 'か, 'ん, 'た, 'ら'};
は違うんじゃないの?

836:デフォルトの名無しさん
09/10/27 00:23:33
>>834
そうだろうね。いずれにせよ>>830
実例をひとつ挙げればそれですむ話を延々としているだけ。

誰もそういう実装のコンパイラが存在しないとは考えていないわけで
規格に合致しないコンパイラがあるなら
その名前を挙げてくれと言っているにすぎない。

837:デフォルトの名無しさん
09/10/27 00:40:30
>>835
リトルエンディアンですねわかります

838:デフォルトの名無しさん
09/10/27 00:48:46
もっと重要な違いがあるだろ

839:デフォルトの名無しさん
09/10/27 01:40:42
compile error

840:皐
09/10/27 02:43:41
このプログラムソースの解説をお願いします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int c;
char *p, o[] = "= +-*/^ ";
double x[26];

int get(void)
{
do c = *p++ & 0xff;
while (isspace(c));
return c;
}



841:デフォルトの名無しさん
09/10/27 02:48:25
うちではインデントのないソースコードは見ないことになっている

842:皐
09/10/27 02:49:29
インデントとはなんですか?


843:デフォルトの名無しさん
09/10/27 03:00:59
pにアドレスを入れていないのに *p++ してるから、いわゆる糞ソース

844:皐
09/10/27 03:02:54
ソース長いんです。
分割でのっけます。
double expr(const char *s)
{
double v;

if (*s == '=') {
char *q = p; int n = get();
v = (islower(n) && get() == '=') ? (x[n-'a'] = expr(s)) : (p = q, expr(s+2));
} else if (*s)
for (v = expr(s+2); c == s[0] || c == s[1]; )
switch (c) {
case '+': v += expr(s+2); break;
case '-': v -= expr(s+2); break;
case '*': v *= expr(s+2); break;
case '/': v /= expr(s+2); break;
case '^': v = pow(v, expr(s)); break;
}

845:皐
09/10/27 03:03:51
3番目です。

else if (get() == '.' || isdigit(c)) v = strtod(p-1, &p), get();
else if (c == '(') v = expr(o), c == ')' ? get() : (c = 1);
else if (c == '-') v = -expr(s);
else if (c == '+') v = expr(s);
else if (!memcmp(p-1, "sqrt",4)) p += 3, v = sqrt(expr(s));
else if (!memcmp(p-1, "exp", 3)) p += 2, v = exp(expr(s));
else if (!memcmp(p-1, "log", 3)) p += 2, v = log(expr(s));
else if (!memcmp(p-1, "sin", 3)) p += 2, v = sin(expr(s));
else if (!memcmp(p-1, "cos", 3)) p += 2, v = cos(expr(s));
else if (!memcmp(p-1, "tan", 3)) p += 2, v = tan(expr(s));
else if (!memcmp(p-1, "atan",4)) p += 3, v = atan(expr(s));
else if (islower(c)) v = x[c-'a'], get();
else v = c = 1; /* error */
return v;
}


846:デフォルトの名無しさん
09/10/27 03:05:07
あー大体わかった。多分逆ポーランド記法で演算器じゃないか?

847:皐
09/10/27 03:05:34
これで最後になります。

int main(void)
{
char buf[1024]; double v;

while (printf("> "), fgets(buf, sizeof buf, stdin) && *buf != '.') {
p = buf; v = expr(o);
if (c) puts(" error");
else {
p = buf;
if (!islower(get()) || get() != '=') printf(" %.15g\n", v);
}
}
return 0;
}



848:皐
09/10/27 03:11:17
はい、電卓を作ろうと思ったので、いろいろとソースを見てたのですが、プログラムの意味が全く分からないんです。
関数電卓で、まず四則演算と三角関数を1つの式で計算しようと思っています。

849:デフォルトの名無しさん
09/10/27 04:05:09
文字列の先頭へのポインタSがあったとして、
Sの示す文字列の3文字目を表す場合どう表現すればいいんでしょうか?
S[2]と書いたら、それはint型だとか言われました

850:デフォルトの名無しさん
09/10/27 04:15:38
typedef unsigned orzchar_t;
orzchar_t s[] = {0x1a33, 0x48b1, 0x5273, 0x542e};
orzchar_t *S;
S = s;
(void)S[2];

とか、そういうことは無いよな
wchar_t使っていると怪しい

とりあえず、コード片でも貼るといいお

851:849
09/10/27 04:22:34
お察しの通りwchar_tを使ってます

wchar_t wcStr[sizeof(szStr)];
WCHAR* strprev = wcStr;

これでif文の中でstrprev[2]としたらint型だと言われました

852:デフォルトの名無しさん
09/10/27 04:43:09
多分>850そのままだと思うんですが、
どうすればSからsのn番目の要素を取り出すことができるんでしょうか?

853:デフォルトの名無しさん
09/10/27 05:22:08
既に出来ているから安心汁

854:デフォルトの名無しさん
09/10/27 05:31:00
URLリンク(codepad.org)

wchar_t を使う場合、
1. locale を正しくセットすること、
2. wchar_t対応のライブラリを使うこと
3. wchar_t と char をごっちゃにしないこと
の3点が重要です^^

ちなみに、wchar_tは符号なし1バイト整数以上のサイズであれば良いとしか規定されていないので
shift_JISすらまともに扱えない環境も普通に存在します^^

855:デフォルトの名無しさん
09/10/27 05:54:01
皆様よろしく。
Cを独学し始めたばかりの初心者です。目的はVBAで書いたコードをCに書き直すこと
です。VBAも独学なので冗長な表現や不要な処理が多々あると思われますが、
とりあえず動いているのでよしとしています。

と、ここからが本題なのですが、とりあえずVBAコードをまとまりのある
ブロックに分けてCに書き直し、コンパイル→実行して意図通りに動いているか
確かめています。すでに4,5個分はチェックできました。
使っているエディタ?は「C言語を始めよう!」というフリーのものですが、
今引っかかっているブロックでは「問題が発生したため、block3.exe を終了します。
ご不便をおかけして申し訳ありません。エラー報告する しない云々・・」という
おなじみの表示が出てしまって、実行できません。
BCCを使っているみたいで、コンパイルエラーは出ないのですが実行できないのです。

これはコードの問題なのか、エディタもしくはそれ以外の問題なのかが目下の悩みです。
この「C言語を始めよう!」は、コード書く→コンパイル→実行という
とてもシンプルで使いやすいのですが、他の「統合開発環境」と名の付くソフト
(たとえばWildStudioなど)はビルドやらプロジェクトやら、意味が分からんことばかりで
使い方を学ぶまで時間がかかりそうで尻込みしています。

コードがまずいのだろうと思われますが、それを確かめるためにも、初心者やさしいエディタ
(開発環境)があれば、教えてください。ただしフリーのもので。






856:デフォルトの名無しさん
09/10/27 05:58:00
メモ帳

857:855
09/10/27 06:12:06
メモ帳にコード書いて・・そのあとが分かりません。コンパイル、実行は
どうやってするの?

858:デフォルトの名無しさん
09/10/27 06:37:47
>>856は意地悪なようだが>>855が教えてくれと言ったこと(だけ)にはちゃんと答えている。

859:デフォルトの名無しさん
09/10/27 06:43:29
それこそが彼が意地悪たる所以である

860:デフォルトの名無しさん
09/10/27 06:59:56
いや、メモ帳はフリーではないだろう。


861:デフォルトの名無しさん
09/10/27 07:00:47
チラシの裏
URLリンク(yuukiremix.s33.xrea.com)
これならフリーソフトだよ。


862:849
09/10/27 07:21:53
色々ためしたけどやはりよく分かりません
setlocaleもやってみましたが全く変化ありません
どうすればwchar_tのn番目の要素とL""の比較ができるんでしょうか?
デバッグ中は期待通りの文字列が見えるのに、一文字だけ取り出そうとするとint型になってしまいます

コマンド引数に/Zc:wchar_tを指定しても変わりありませんでした
(VC++では規定で有効らしいので当たり前ですが)

863:デフォルトの名無しさん
09/10/27 07:24:46
>>862
できるわけないだろ…。

864:デフォルトの名無しさん
09/10/27 07:27:38
/D_UNICODE

865:デフォルトの名無しさん
09/10/27 07:48:32
const wchar_t* str = L"あいうえお";
const wchar_t comp = L'う'; // == L"う"[0]
if (str[2] == comp) {}

866:デフォルトの名無しさん
09/10/27 08:04:52
>865
それだとif文で左辺がint型、右辺がconst wchar_t*型でエラーが出ます
Unicodeを調べて両辺int型でやればなんとかうまくいくようです
wchar_t型の文字のUnicodeを求める関数などはあるのでしょうか?

867:デフォルトの名無しさん
09/10/27 08:43:52
ある

868:デフォルトの名無しさん
09/10/27 08:44:54
>>866
>右辺がconst wchar_t*型で

???

869:デフォルトの名無しさん
09/10/27 08:50:47
>>866
うん。明らかに君の使っているコンパイラは標準に合致してない。
別のコンパイラに変えるしかないよ。
そのコンパイラではどうやってもwchar_t同士の比較はできない。

870:デフォルトの名無しさん
09/10/27 09:39:44
>>866
wchar_t が unsigned なのかも

871:デフォルトの名無しさん
09/10/27 10:50:58
>>855
アドバイスするとしたら
わざわざC言語使わなくてもVBAでいいんじゃない?
ってことくらいかな。
あと、異常終了するのはまず間違いなくコンパイラやエディタのせいではない
と思っていい。

872:デフォルトの名無しさん
09/10/27 10:51:53
ヘッダで
#define wchar_t int
とかやってたりしてな。

873:855
09/10/27 12:25:42
>>871
>わざわざC言語使わなくてもVBAでいいんじゃない?
プログラムをLinuxで走らせたいのです。

>異常終了するのはまず間違いなくコンパイラやエディタのせいではない
やはり、コードですかね。問題は。
もうちょっとがんばってみます。 ありがとうございました。

874:デフォルトの名無しさん
09/10/27 12:36:59
>>873
スクリプト系言語にしたら?
LinuxならRubyでもPythonでも選り取り緑でしょ。

875:デフォルトの名無しさん
09/10/27 12:42:06
C言語を始めよう!はwindowsじゃないの?

876:デフォルトの名無しさん
09/10/27 13:06:26
>>873
Linuxで動かすつもりなら、Linuxで開発したほうが楽だと思うけどね。
Windowsと違うところ結構あるし。
あと、まさかWindows特有の機能使おうとはしてないよね?

877:855
09/10/27 13:16:49
>>875
>>876
あの〜、この辺まったく知らないんですが、Windows上で動くcプログラムでも
Linuxで動かないってことあるんですか?あ、もちろんWindows特有の機能ってのは
使わない上での話ですが。
「Linuxで走らせる」っていうのも先の目標でして、実際はKnoppixのデスクトップ画面
を、自身のPCで見たことがある程度の者です。

878:デフォルトの名無しさん
09/10/27 13:23:29
>>877
> Windows上で動くcプログラムでも
> Linuxで動かないってことあるんですか?
あるねぇ。

> あ、もちろんWindows特有の機能ってのは
> 使わない上での話ですが。
あなたのレベルでは、Windows特有の機能かどうかの判断は難しいと思う。

879:デフォルトの名無しさん
09/10/27 13:40:23
>>877
自分のLinux上で動くcプログラムが
他人のLinuxで動かないってこともある

880:855
09/10/27 13:44:25
>>879
ほんとですかw。どーゆーこと?って感じですね。

881:デフォルトの名無しさん
09/10/27 13:52:13
理由がわからん香具師はおとなしくスクリプトつかっとけ
Windows の VB に相当するのは Python だ


882:デフォルトの名無しさん
09/10/27 13:54:20
標準ライブラリからちょっとでも逸脱しなければ大抵大丈夫だと思うが

883:デフォルトの名無しさん
09/10/27 15:05:01
>>794
引数に配列名を持ってくるときは自動的に配列の1番目の要素のアドレスを表すので&は不要ということはわかりましたが
そこを直してもやはりダメでした
というかunsigned charに対するフォーマット指定子は%sでよいのでしょうか?
もちろん文字列入力を行うということなのですが・・・

884:デフォルトの名無しさん
09/10/27 15:11:01
問題はI/O。標準ライブラリでのI/Oって、stdin, stdout, stderrとfopen系のストリームくらい。
ディレクトリ操作すら標準化されてない。GUIなど無論。

885:デフォルトの名無しさん
09/10/27 15:12:13
>>883
"%s"は試したの?

886:デフォルトの名無しさん
09/10/27 15:13:27
どうダメだったの?
scanf("%s", tripkey);
これでダメなら原因は別のとこにある。

887:デフォルトの名無しさん
09/10/27 15:36:11
>>885
試しましたがダメでした

>>886
同じようにコアを吐きます

とりあえずソース全部です・・・
この部分だけでなく他にもおかしいところが多々あって見苦しいとは思いますが・・・
URLリンク(ccfa.info)

888:デフォルトの名無しさん
09/10/27 15:44:20
>>887
crypt()周辺がおかしいんで内科医?
crypt()の仕様はどうなってんのよ。
つーか、手元にcrypt()がないからコメントアウトしたら、実行しても少なくともコアは吐かないんだが。

889:デフォルトの名無しさん
09/10/27 15:47:29
>>877
C言語を始めよう!ってなんじゃろうと思って調べたら統合開発環境だた

890:デフォルトの名無しさん
09/10/27 15:47:45
いろいろ間違ってるが、crypt(tripkey, salt);のように*をはずしたら最後までいったな

891:デフォルトの名無しさん
09/10/27 15:52:14
>>887
cryptの呼び出しは
strcpy(trip_f, crypt(tripkey, salt));
こんな感じ?

892:デフォルトの名無しさん
09/10/27 15:56:14
>>887
printf("トリップキーを入力:");
scanf("%u", &tripkey);

printf("トリップキー入力"); ←これが表示されずにコアを吐く
fflush(stdout); ←これを追加したら↑これ出ないかな

893:デフォルトの名無しさん
09/10/27 16:33:35
>891
本来ならそんな感じで呼び出すはずだけど

僕の環境では
/usr/include/unistd.h:1073:extern char *crypt (__const char *__key, __const char *__salt)
/usr/lib/i386-redhat-linux4E/include/unistd.h:1019:extern char *crypt (__const char *__key, __const char *__salt)
となっていたから

diff
96c96
< *trip_f = crypt(*tripkey, *salt);
---
> strcpy(trip_f, crypt(tripkey, salt));

結果
./up1812
トリップキーを入力:foo
トリップキー入力トリップキー前処理salt作成1回目:OK2回目:OK3回目:OK4回目:OK5回目:OK◆yaoo

894:デフォルトの名無しさん
09/10/27 20:59:52
typedef struct data{
___char mozi[100]; //文字列格納用
_______int year[100];//点数格納用
}Data;

Data data[100];構造体を100個用意

data[0].mozi="aaaaaaaa";←*1

printf("%s",data[0].mozi);

これでコンパイルすると*1の部分が「左辺値が必要」といわれてしまいます。
どうやったら文字列を格納できるのでしょうか?

895:デフォルトの名無しさん
09/10/27 21:10:43
strcpy

896:デフォルトの名無しさん
09/10/27 21:12:36
strcpy(data[0].mozi,"aaaaaaaa");

897:デフォルトの名無しさん
09/10/27 21:14:53
>>895-896
ありがとうございます。
配列=配列ができないのと同じ原理なんですね。

898:デフォルトの名無しさん
09/10/27 22:46:47
char *a[8];
char (*b)[8];

この違いを教えてください。

899:デフォルトの名無しさん
09/10/27 22:47:50
Cってカンタンだよね。
すぐにUSB接続デバイスとか
作れそう。

900:デフォルトの名無しさん
09/10/27 22:54:26
>>899
DDK次第

901:デフォルトの名無しさん
09/10/27 22:55:55
道路の交通量調査などに使われてる(?)紅白で野鳥の会の人が使ってる(?)
カウンターの様な機械をC言語で作ってみたいと思っています。

コマンドプロンプト上で、Enterを押せば数字が増えていくというモノです。

Enterの入力があれば用意した変数に1を足して出力 とするプログラムはすぐに書けると思うのですが、
C:\>counter.exe
Enterの入力回数:1
Enterの入力回数:2
Enterの入力回数:3
・・・・
Enterの入力回数:100
の様な感じになると思います。
C:\>counter.exe
Enterの入力回数:XXX として、Enterを押せばXXXの部分の数字だけを書き換える
という事は出来るのでしょうか?

説明が下手なのですが、内容を察して教えて下さい。
もしよろしければコーディングまでよろしくお願いします。

902:デフォルトの名無しさん
09/10/27 22:58:31
CLSして再描画する?

903:デフォルトの名無しさん
09/10/27 23:03:20
#include <stdio.h>
int main(void)
{
  int counter=0;
  while(1){
    int c = getchar();
    if(c=='\n'){
      counter++;
    }
    system("clear");
    printf("counter:%d\n", counter);
  }
  return 0;
}

※windowsならsystem("cls");

904:デフォルトの名無しさん
09/10/27 23:05:15
>>901
非標準な事をすれば可能
環境を書いてくれないと無理

905:デフォルトの名無しさん
09/10/27 23:11:20
>>901 conio.h があるなら
#include<stdio.h>
#include<conio.h>

#define KEY_ENTER 0x0d
#define KEY_ESCAPE 0x1b

int main(void){
int count=0, key;

while(1){
key=getch();
if(key==KEY_ENTER) printf("\rEnterの入力回数:%d ", ++count);
if(key==KEY_ESCAPE) break;
}
return 0;
}

906:デフォルトの名無しさん
09/10/27 23:11:30
>>901
本当はこうなってるんじゃないの?

C:\>counter.exe

Enterの入力回数:1
Enterの入力回数:2
Enterの入力回数:3
・・・・
Enterの入力回数:100

表示が本当に >>901 の通りなら入力にエコーが無いから
単に改行しなければ良いだけだろ


907:デフォルトの名無しさん
09/10/27 23:12:57
int counter=0;

これってCだと必須なんだ。
変数を宣言しないと
つかえないから。

908:894
09/10/27 23:17:53
/**おまじない省略**/
struct suji{
char moji[100];//文字列格納
int su[100];//数字格納用
};

int main(void)
{
____struct suji score[100];//100の構造体を用意
____FILE *fp;
____char *tp;
____char str[256];//ファイルの行を格納する配列
____int i=0,k=0;

____ if((fp= fopen("input.txt", "r")) == NULL)exit(1);
____________while( fgets(str,256,fp) != NULL)//ファイルの中身がなくなるまで
____________{;
/************文字列格納******************************/
________________tp=strtok(str,","); //文字列格納 tp=ポインタ
________________strcpy(score[i].moji , tp); //文字列コピー
________________printf("%s\n" , score[i].moji); //テスト表示
________________i++;//構造体を一つ進める
/***************数字格納******************************/
____________________while(tp!=NULL){//一行読みきるまで
____________________________score[i-1].su[k] = atoi(strtok(NULL , "," ));//i-1は上でi++してるため無効化する作業
____________________________printf("%d\n" , score[i-1].su[k] ); //テスト表示
____________________________k++;
____________________}
_____________}
___________fclose(fp);
___________return 0;
}

909:894
09/10/27 23:18:57
上のプログラムはCSVファイルを一行ごとに構造体配列に格納するプログラムを目指してます。
input.txtには、文字列,数字1,数字2・・・,数字n(文字列は行の先頭に一つだが、数字はいくつでも可能)といった形式で入っています。

このプログラム、コンパイルは正常にできますが実行するとエラーで強制終了となります。
何がおかしいかご教授ください。

CSVファイルが
aiueo,10,23,53,55,60
kakikukeko,22,33 
の2行だったら格納後、適当なメンバを参照すると
score[0].enzan=aiueo
score[0].su[0]=1
score[0].su[1]=2
score[1].enzan=kakikukeko
score[1].su[1]=33
という具合になる予定です。




次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5147日前に更新/215 KB
担当:undef