[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 01/17 15:29 / Filesize : 215 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 54



1 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 20:41:54 ]
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 130代目
pc12.2ch.net/test/read.cgi/tech/1250204272/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 53
pc12.2ch.net/test/read.cgi/tech/1253110182/

過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

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

定番で悪いが
Linux流プログラム書法
ttp://www.linux.or.jp/JF/JFdocs/kernel-docs-2.2/CodingStyle.html

757 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:54:03 ]
>>757
> scanf("%u", &tripkey);

scanfの使い方調べろよ

759 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:54:48 ]
制御にくっつく単文でもブレースで括ってくれと言いたかったんだ
ブレースだけの行があるのが嫌な人もいるんだろうけどね
もう慣れているからどちらでもいいんだけど、修正時のエンバグ対策に{}付けていた体質を改めようかな、はっはっはぁ

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

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

とかもう

762 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:10:11 ]
関数は

int
foo(int n, int m)
{
}

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

763 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:13:37 ]
>>753
他人が読むことを想定していないコードだな

764 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:14:21 ]
>>763
具体的にどこがそうなのか挙げてみれ



765 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:16:07 ]
スタイル議論してるスレがあるはず。

766 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:16:56 ]
関数は

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

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

767 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:17:47 ]
>>764
わかってるくせに

768 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:18:59 ]
>>759
Java みたいなのはお前の方だw

769 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:23:52 ]
>>767
>>753は、非難されるほどひどいスタイルには見えん。
ひどい点があるなら、教えてくれないか

771 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:26:58 ]
>>770
全角スペース

772 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:28:11 ]
スタイルじゃなくて、これが紛らわしいってこと

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


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

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

774 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:32:17 ]
>>771
htmlでインデントを表現するために、わざと全角空白をつかってるんじゃないか?

776 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:36:39 ]
>>775
 
使え

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

777 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:54:13 ]
>>775
&nbsp;
使え

消えてたorz

778 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:02:01 ]
&amp;を忘れたのねw

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


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

781 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:13:57 ]
なんだかよくわからないものをなんだかよくわからないまま使っても
なんだかよくわからない結果にしかならないと思うんだ

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

783 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:47:18 ]
>>782
%sと%cを試してみたけど変わりませんでした


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

なのか

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



785 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 15:03:19 ]
>>783
へぇ

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

787 名前:どちらが正統? mailto:sage [2009/10/26(月) 16:20:53 ]
char s[7]="foobar";

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

のか

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

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

一応、PHPで、

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

ifでの分岐
switch文での分岐

for、while、foreachでのループ

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

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

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

ファイルへの読み書き

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

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

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

791 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 16:37:48 ]
PHPで、

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

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

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

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

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

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



795 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 17:06:55 ]
>>791
C-CGI作るならもちろんその辺もやらないとだめだよ

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

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

空気よめよwww

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

おしえれ〜〜

798 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 17:45:57 ]
2chのread.cgiはcだそうだ

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

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

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

801 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 18:10:22 ]
2chブラウザのおかげね。

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

803 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 19:26:03 ]
どうして?

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



805 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 19:44:08 ]
多くの専ブラはそれの対応したはずだが

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

807 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 20:20:00 ]
それって専ブラの起因した問題じゃないと思うが

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


809 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 20:25:09 ]
人間の能力はあがってないだろ

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

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

812 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 20:31:23 ]
ttp://f30.aaa.livedoor.jp/~kokodake/unix.html
昔話

813 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 20:31:28 ]
なら転送量は増えないの?

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

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

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



815 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 20:40:24 ]
説明するのは面倒なので ttp://monazilla.org/ の資料でも読んでください

816 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 21:42:38 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10020.txt

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



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

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

818 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 22:13:19 ]
>>817
大丈夫
保証される

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

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

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

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

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

824 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:16:37 ]
リテラルに関しては特別である件について

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



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

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

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

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

829 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:35:06 ]
>>828
constはつかないんじゃないの?

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

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

831 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:52:37 ]
Cの規格上ではつかないよ。

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

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

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

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



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

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

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

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

837 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 00:40:30 ]
>>835
リトルエンディアンですねわかります

838 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 00:48:46 ]
もっと重要な違いがあるだろ

839 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 01:40:42 ]
compile error

840 名前: mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 02:48:25 ]
うちではインデントのないソースコードは見ないことになっている

842 名前: mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/10/27(火) 02:49:29 ]
インデントとはなんですか?


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

844 名前: mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/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 名前: mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 03:05:07 ]
あー大体わかった。多分逆ポーランド記法で演算器じゃないか?

847 名前: mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/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 名前: mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/10/27(火) 03:11:17 ]
はい、電卓を作ろうと思ったので、いろいろとソースを見てたのですが、プログラムの意味が全く分からないんです。
関数電卓で、まず四則演算と三角関数を1つの式で計算しようと思っています。

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

850 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/10/27(火) 04:22:34 ]
お察しの通りwchar_tを使ってます

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

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

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

853 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 05:22:08 ]
既に出来ているから安心汁

854 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 05:31:00 ]
codepad.org/iPSWOKX6

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

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



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

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

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

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






856 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 05:58:00 ]
メモ帳






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<215KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef