C言語なら俺に聞け( ..
[2ch|▼Menu]
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
 
使え

消えてたorz

778:デフォルトの名無しさん
09/10/26 14:02:01
&を忘れたのね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
という具合になる予定です。



910:デフォルトの名無しさん
09/10/27 23:20:25
score[0].su[0]=10
score[0].su[1]=23
の間違いです。

911:デフォルトの名無しさん
09/10/27 23:23:32
>>898
全然違う。後者に使い道はない。

912:デフォルトの名無しさん
09/10/27 23:28:16
今、大学の課題を考え中なのですが、
「定義域 -1.5<=x<=1.5の時
 関数 y=3x^3-0.2x^2+0.3x-0.7
 の値を出力するプログラムを作れ。
 なお、xは-1.5から0.1刻みで増やすこと」

という問題なのですが、
↓のようなプログラムを実行させると
なぜか、x=1.5のときだけ出力されません・・・


913:つづき
09/10/27 23:28:59
#include <stdio.h>

main()
{
float x, y, step;
x=-1.5;
step=0.1;
y=0.0;

while(x>=-1.5 && x<=1.5){
y=3.0*x*x*x-0.2*x*x+0.3*x-0.7;
printf("%4.1f %9.5f\n", x, y);
x = x + step;
}


}

ちなみに、
whileの中の条件式を
x>=-1.5 && x<1.6 (右の不等式のイコールをとって、1.6にしてみた)
とか
x>=-1.5 && x<=1.51
とかにかえると正しい結果が得られました。

どこで間違ってるのでしょう??

どなたかご教授願います
m(_ _)m


914:デフォルトの名無しさん
09/10/27 23:40:45
>>911
使い道はある
(単純な二次元配列でも使うし固定長配列へのポインタを関数の引数にする場合にも使う)

>>898
>char *a[8];
char *a; が8個
char *a[8] = {"abcd", "ef", "gh", "ijkl", "mnopq", "rst", "uv", "wxyz"};

>char (*b)[8];
char [8]へのポインタb または char [8]がn個 の配列
char (*b)[8] = {"abcdefg", "1234567", "zyxwvut"};


915:デフォルトの名無しさん
09/10/27 23:41:31
浮動少数は厳密なものじゃなく近似値だから
ピッタリでは判定できないことが多いよ。


916:デフォルトの名無しさん
09/10/27 23:46:56
while(!((x+1.5)<0.0 || (x-1.5)>0.0)){


917:デフォルトの名無しさん
09/10/27 23:49:58
>>913
0.1を正確に表せないから。

step=0.1;
としても、0.1よりちょっとずれた値になるので、何度も足してると誤差が蓄積する。
誤差少なくするなら、
double x;
int n;
for(n = 0; n <= 30; n++){
x = -1.5 + n*0.1;
...
}
みたいな。

918:デフォルトの名無しさん
09/10/28 00:16:08
>>917

へぇ〜
そんな話、聞いたことありませんでした!!
ありがとうございました!!

ところで、
どうして、その1次関数で
誤差を少なくすることができるのでしょうか??

何度も何度も聞いてしまってスイマセン・・・
m(_ _)m

919:デフォルトの名無しさん
09/10/28 00:27:33
>898

型が違う。

aはcharを指すポインタの配列(要素数は8)
bはcharの配列(要素数8)を指すポインタ

aに+1するとsizeof(char*)増加(32ビット環境なら通常4)
bに+1するとsizeof(char[8])増加(8)


920:デフォルトの名無しさん
09/10/28 00:30:01
>897

>配列=配列ができないのと同じ原理なんですね。
というか、文字列リテラル("aaaaaaaa")の型はconst charの配列
なので、問題の箇所は「配列=配列」そのもの。

921:デフォルトの名無しさん
09/10/28 00:35:35
>911

>>898
>全然違う。後者に使い道はない。


いやいや、普通にあるでしょ。
char a[N][8];
を引数にとる関数の仮引数の型がそう。



922:デフォルトの名無しさん
09/10/28 01:10:00
ならなんで
char *(b[8]);
じゃないの?

923:デフォルトの名無しさん
09/10/28 01:28:14
fclose() が NULL を受け付けないおかげで
fclose(func(fopen(fname,"r")));
みたいに出来ないから困る。
free(func(malloc(s)));
ならできるのにな。


924:デフォルトの名無しさん
09/10/28 01:36:53
char (*b)[8];について、
演算子の優先順位で覚えればいいと言いたい所だけど、
*は、演算子では無くポインタ宣言子なわけで、
(ついでに言うと、[]もここでは演算子でないのよ、優先順位は、高 () > [] > * 低)
でも、間接参照するときは、(*b)[i]のようにしないと演算子の優先順位があって、
いや、何というかね

char *(b[8]);は、bに[]が付いているから、bは配列、それに*が付いているから、ポインタの、型はcharである。
つまり、bは、char型のポインタの配列と解釈されるわけで。b is array[8] of pointer to char.優先順位の高い方から低い方へ。
まぁ、『Cの強化書』とか『エキスパートCプログラミング』でも読めばいいよ。

925:デフォルトの名無しさん
09/10/28 01:43:12
NULLを受け付けるようなfcloseを自分で作るとか一瞬だけ思ったんだが駄目かな

int myfclose(FILE *stream)
{
 if(NULL == stream)
  return 0;
 else
  return fclose( stream );
}

926:デフォルトの名無しさん
09/10/28 01:47:22
素直にwrapper作ればよくないか
標準関数を直呼びすることはあまり無くなった
int safe_fclose(FILE *f) {
 if ( f == NULL ) {
  return 1;
 }
 return fclose(f);
}
戻り値を何にするかちょっと悩んだ。

927:デフォルトの名無しさん
09/10/28 01:57:14
#include <stdio.h>
#include <time.h>
#include <Windows.h>
int main(void){
time_t timer;
struct tm *t_st;
while(1){
time(&timer);
printf("現在時刻: %.24s\r", ctime(&timer));
Sleep(1000);
}
}
このプログラムで、Ctrl+Cの強制終了ではなく、Escapeなどできれいにプログラムを終了させるには
どうしたら良いでしょうか?

928:デフォルトの名無しさん
09/10/28 01:59:43
>char *(b[8]);は、bに[]が付いているから、bは配列、それに*が付いているから、ポインタの、型はcharである。

doubt

929:デフォルトの名無しさん
09/10/28 02:01:57
windowsみたいだから
getchでESC押されたか判定して抜けると良いんじゃない

930:デフォルトの名無しさん
09/10/28 02:03:00
>>927
escapeがきれいだとは思わない

931:デフォルトの名無しさん
09/10/28 02:04:04
どうしてそんなにsleepしたがるのだ。
OSに大麻イベントをセットしてWM_TIMERで読んでもらえばいいじゃないか。
え?ミリ秒単位で制御したいの?

どっかのスレで誰かが副作用で暴れてたなぁ。

932:デフォルトの名無しさん
09/10/28 02:13:11
>>927
#include <stdio.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>

int main(void){
time_t timer;
struct tm *t_st;
while(1){
time(&timer);
printf("現在時刻: %.24s\r", ctime(&timer));
Sleep(1000);
while(kbhit()){
if(getch()==0x1b)break;
}
}
}


933:デフォルトの名無しさん
09/10/28 02:14:19
ごめん間違えた。

934:927
09/10/28 02:17:14
>>929
#define KEY_ESCAPE 0x1b
int key;
while()1{
key=getch();
if(key==KEY_ESCAPE) break;
・・・・・
}
としてみたのですが、何かキーを押さないと時刻を更新しなくなります。

>>930
そうですよね。


強制終了ではなく、キー入力でwhileから抜けて処理終了を「きれい」と言っていました。

>>931
全く知識がないので、sleep使えば手っ取り早くできるかなと思いまして・・・・

935:デフォルトの名無しさん
09/10/28 02:19:18
#include <stdio.h>
#include <time.h>
#include <Windows.h>
int main(void){
time_t timer;
struct tm *t_st;
while(1){
while(!_kbhit()){
time(&timer);
printf("現在時刻: %.24s\r", ctime(&timer));
Sleep(1000);
}
if(_getch()==0x1b)break;
}
}


936:デフォルトの名無しさん
09/10/28 02:23:55
エレガントじゃないな。

#include <stdio.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>
int main(void){
time_t timer;
struct tm *t_st;
do{
while(!_kbhit()){
time(&timer);
printf("現在時刻: %.24s\r", ctime(&timer));
Sleep(1000);
}
}while(_getch()!=0x1b);
return 0;
}

こうだろ。

937:927
09/10/28 02:37:30
kbhit()なんてものがあったんですね。

もしお時間があれば、>>931さんの言うタイマーイベントを使ったプログラムのサンプルをお願いします。

私の環境はWinVista
コンパイラ:Borland C++ 5.5.1
です。

よろしくお願いします。

938:デフォルトの名無しさん
09/10/28 02:43:07
ボーランドのコンパイラなら

_kbhit() → kbhit()
_getch() → getch()

に置き換えだな。
MicroSoft は非標準には '_' を付けてる。

939:デフォルトの名無しさん
09/10/28 02:44:59
Windows のタイマーイベントはウィンドウメッセージだから、
それを受け取るウィンドウが必要だぞ。

940:デフォルトの名無しさん
09/10/28 02:48:35
つ select

941:デフォルトの名無しさん
09/10/28 02:49:22
宿題スレでもC++対応でそこに誘導している以上
このスレもC++拒否じゃなくて、無保証対応で
良くね?

942:デフォルトの名無しさん
09/10/28 03:09:06
>>937
#include <stdio.h>
#include <time.h>
#include <Windows.h>

VOID CALLBACK tp(HWND hwnd, UINT u, UINT_PTR p, DWORD dw){
time_t timer;
struct tm *t_st;
time(&timer);
printf("現在時刻: %.24s\r", ctime(&timer));
}

int main(void){
SetTimer(0,0,1000,tp);
while(getch()!=0x1b);
return 0;
}


943:デフォルトの名無しさん
09/10/28 04:53:52
>>924
その本には char (*b)[8]がポインタの配列であると書いてるの?
そうなら子供の落書き帳にでもしちゃいなよ

944:デフォルトの名無しさん
09/10/28 04:55:35
うあ?
途中から char *(b[8])の話になってる。すまんこ。

945:デフォルトの名無しさん
09/10/28 08:04:04
select

946:デフォルトの名無しさん
09/10/28 23:03:47
>>924
> () > []

アホ

947:デフォルトの名無しさん
09/10/28 23:38:34
>>946
なんとなくカンテーレ

948:921=919
09/10/29 00:24:38
>922

なんか、違う人間が同じ問にレスしてわけわかになっていますな。

>ならなんで
>char *(b[8]);


宣言子においては*と[]では[]の方が結びつきが強いので
char *b[8];

char *(b[8]);
は同じ。

かえって混乱するかもしれないけど『関数の仮引数の宣言部では』
void func(char b[N][8]);
void func(char b[][8]);
void func(char (*b)[8]);
は全て同等。

ついでに上のbと下のcは別物。下の宣言同士は全て同等
void g(char *c[N]);
void g(char *c[]);
void g(char **c);


>924さんはもちろん理解していると思うけど、
>間接参照するときは、(*b)[i]のようにしないと
いやそこは普通はb[0][i]になるよね。

949:デフォルトの名無しさん
09/10/29 00:56:38
>>908-909
ざっと見て2つほど明らかなバグがあるけど面倒なので詳細は説明しない。
・2つ目のwhileの条件
・k

デバッガの使い方を覚えて1行ずつトレースしてみるのいいと思うよ。


950:デフォルトの名無しさん
09/10/29 02:19:12
>>948
> >間接参照するときは、(*b)[i]のようにしないと
> いやそこは普通はb[0][i]になるよね。
ケースバイケースじゃないか?

951:デフォルトの名無しさん
09/10/29 11:05:30
C言語を学び始めたのですが文字列の扱いで詰まってしまいました。
ある文字列について、任意のn番目の文字からx文字だけ参照したいときにはどんな関数を使えばよいのでしょうか?
strcpyやstrncpyでは先頭からしか見ることができないので困っています。

//////////////////////////////
char STR[]
char Buf[]

sprintf( Buf ,"123,456\0");
//////////////////////////////

このようなコードがあるときにSTRにBufの5文字目から7文字目まで(456)だけ
コピーするにはどうすれば…

任意のトークンで区切れるstrtokも状況によっては使えそうなのですが
挙動が分からずNullエラーになってしまったりして安定しません…

952:デフォルトの名無しさん
09/10/29 11:10:07
>>951
sprintf(Buf, "123,456\0"+4);

953:デフォルトの名無しさん
09/10/29 11:12:24
char Buf[10];
char *str = "123,456\0";
int start = 5;
int end = 7;
sprintf(Buf, "%.*s", end - start + 1, str + start - 1);

954:デフォルトの名無しさん
09/10/29 11:24:15
速やか過ぎる返信ありがとうございます。

>>952のも>>953のもどちらも実行結果は正しいのですが
肝心の何故こうなるのかが理解できてません。ダメジャンorz

>>952の方のはsprintf関数の挙動を調べればなんとなく分かりそうなのですが(文字列操作に+4って何事?状態)
>>953のお方のは正直何が起こっているのかさっぱりです。ポイン・・・タ・・・?

とにかくとっかかりは掴めたのでもう少し調べてみようと思います。ありがとうございました

955:デフォルトの名無しさん
09/10/29 11:27:00
Buf+4 は &Buf[4] と同じ・・・ と言ってもわからないだろうか?
正直、ポインタの理解なしに文字列操作は厳しいと思う

956:デフォルトの名無しさん
09/10/29 11:32:45
>>955
>Buf+4 は &Buf[4] と同じ
だということを今知ったレベルでした。
ポインタはなんとなーく概念的にはつかんでいるものの使いこなすには至らず逃げてばかりだったので…
ネットワーク間でデータをやりとりしたいため文字列操作に手を出さざるを得なくなったのですが
ポインタの基礎から把握していないと駄目っぽいですね…

957:953
09/10/29 11:37:57
こう書けば読めたりするだろうか。

char str[10];
strcpy(str, "123,456");
sprintf(Buf, "%.3s", str[5-1]); /* 5文字目の添え字は4 */

958:951
09/10/29 11:47:59
>>957
お恥ずかしながらフォーマット指定子で .[整数] ってなんだっけ…レベルです。
そして%sでstr[4]を指定すると何故5文字目以降が参照されるのかもしっかり把握していません。

後者は
sprintf(Buf,"%s",str);
は str[0]から\0にぶつかるまで参照していたということなのでしょうか。

とにかく、今やってみたおかげで>>957に類するコードを入力したら
何故かは知らないけどこうなる!というのが分かる状態になりました…
がそんなんでは使いものになりませんよね


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

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