トップページ⇒tech
1001コメント258KB

VIPPERでもわかるC言語 Part2

■ このスレッドは過去ログ倉庫に格納されています
0001ぬるぽ2005/11/05(土) 20:20:34
はいたてましたよ。
天ぷらは>>2あたり
0232デフォルトの名無しさん2005/11/06(日) 01:56:39
>>229
ポインタ配列
0233デフォルトの名無しさん2005/11/06(日) 01:57:14
->この→は何を意味しているんですか?
代入?
0234デフォルトの名無しさん2005/11/06(日) 01:57:28
>>229
いや、これはポインタの代入だからいいのだ
0235デフォルトの名無しさん2005/11/06(日) 01:57:32
>>193
C単体ではグラフィックの機能がないって意味だとオモタ
Cは描画する機能を呼び出す役割ってことか
0236デフォルトの名無しさん2005/11/06(日) 01:58:05
>>232
うはw見落としてた
ポインタ配列だったか・・・
0237デフォルトの名無しさん2005/11/06(日) 01:58:39
>>231
*test->vipper[0]と*(test->vipper[0])は同じ。アロー演算子の方が優先順位が高いから。
ちなみにポインタ演算子を抜かすとメンバへのアクセスがおかしくなるはず

勘違いとかだったらごめんね、俺も初心者だから
0238デフォルトの名無しさん2005/11/06(日) 01:59:03
>>228
おいおい、testもvipper[0]もポインタだぜ?
そこに"ヒャッホウ!!"のアドレスを渡すんだから、

test->vipper[0] = "ヒャッホウ!!";

ってなるだろ?
0239デフォルトの名無しさん2005/11/06(日) 02:00:09
>>233
ポインタから直接メンバ変数へのAccessVBA
0240デフォルトの名無しさん2005/11/06(日) 02:01:06
>>237
それでもだめだろwwwwwww
0241デフォルトの名無しさん2005/11/06(日) 02:01:18
ふむふむ、すごい参考になるお
0242デフォルトの名無しさん2005/11/06(日) 02:02:08
test2.vipper[0] = "ヒャッホウ!!";
だよな?
0243デフォルトの名無しさん2005/11/06(日) 02:03:09
>>238
あーそっか。

str *vipper = "test";
こんな形ばかり見てたから、

str *vipper;
*vipper = "test";
これで正しいと勘違いしてましたorz
0244デフォルトの名無しさん2005/11/06(日) 02:03:18
これはまとめサイトにのせておくお
0245デフォルトの名無しさん2005/11/06(日) 02:03:42
TEST* test;
TEST test2;
test = &test2;

とおなじで、

test->vipper[0] これは char*

よろしいか?
0246デフォルトの名無しさん2005/11/06(日) 02:04:16
お前ら初心者置いてきぼりにしないで構ってください
0247デフォルトの名無しさん2005/11/06(日) 02:05:09
>>243

str *vipper = "サイタマサイタマ";

ああ、宣言と初期値の代入を一緒に書く方法な。
0248デフォルトの名無しさん2005/11/06(日) 02:05:38
str* → char* だとおもまーす
0249デフォルトの名無しさん2005/11/06(日) 02:06:36
・゚・(     ノ    |    <●>     )・゚・
0250デフォルトの名無しさん2005/11/06(日) 02:06:42
>>248
そうだね、そうだねorz

C#もやってるから狂ってるよ
0251デフォルトの名無しさん2005/11/06(日) 02:06:51
>>248

#typedef str char;
0252デフォルトの名無しさん2005/11/06(日) 02:08:45
typedef char str;な
0253デフォルトの名無しさん2005/11/06(日) 02:09:38
#define str char
0254デフォルトの名無しさん2005/11/06(日) 02:10:20
このスレ超流れ速いな
0255デフォルトの名無しさん2005/11/06(日) 02:10:42
で、お前ら何の話してるんだ?
0256デフォルトの名無しさん2005/11/06(日) 02:11:19
凡ミスだらけのC談義
0257デフォルトの名無しさん2005/11/06(日) 02:11:25
>>246
俺と一緒にFlash職人目指そうぜ!
0258デフォルトの名無しさん2005/11/06(日) 02:11:35
>>251
どうせやるなら、
typedef char* str;
の方がいいと思う

>>253
#defineは止めとけ
0259デフォルトの名無しさん2005/11/06(日) 02:13:20
>>246
よし、なんでも聞いてくれ!
0260デフォルトの名無しさん2005/11/06(日) 02:14:05
>>259
>>255
0261デフォルトの名無しさん2005/11/06(日) 02:16:03
typedef char* str;

これはシロウトにはお勧めしない。
0262デフォルトの名無しさん2005/11/06(日) 02:16:59
ポインタ変数には文字列のアドレスを代入できるんだって話だと思う。
アドレスを代入してるんであって、文字列そのものをコピーしてるんじゃないってとこがポイントだな。
あばよ!
0263デフォルトの名無しさん2005/11/06(日) 02:20:36
>ポインタ変数にはポイントだな。

OK、把握した。
0264デフォルトの名無しさん2005/11/06(日) 02:23:32
>ポインタ変数にはあばよ!

OK、把握した。
0265デフォルトの名無しさん2005/11/06(日) 02:25:07
char *tinpoppo[]=" (*‘ω‘*)ちんぽっぽ!";
これはOK?
0266デフォルトの名無しさん2005/11/06(日) 02:26:58
>>265
取り出し方間違わなければ良いんじゃね?
0267デフォルトの名無しさん2005/11/06(日) 02:27:06
>>265
だめ

char* str[] = {"str1", "str2", "str3"};
0268デフォルトの名無しさん2005/11/06(日) 02:27:31
#include <stdio.h>
#define VIPPER int main(){while(1)puts("m9(^Д^)プギャ-");}

VIPPER
0269デフォルトの名無しさん2005/11/06(日) 02:29:53
リターンするの忘れてた

#include <stdio.h>
#define VIPPER int main(){while(1)puts("m9(^Д^)プギャ-");return 0;}

VIPPER
0270デフォルトの名無しさん2005/11/06(日) 02:30:31
これはひどいwww
0271デフォルトの名無しさん2005/11/06(日) 02:31:10
報われることのないreturnにモエッス
0272デフォルトの名無しさん2005/11/06(日) 02:31:57
>>267
char *tinpoppo[]={" (*‘ω‘*)ちんぽっぽ!"," ( *’ω’*)"};
でFA?
0273デフォルトの名無しさん2005/11/06(日) 02:33:10
>>272
おk
0274デフォルトの名無しさん2005/11/06(日) 02:38:59
char *test[][] = {{"test","test","test"},{"test","test","test"}}
こうですか?わかりません><

…本気でわかんね
0275デフォルトの名無しさん2005/11/06(日) 02:57:43
char *test[][3] = {{"test","test","test"},
           {"test","test","test"}};

これでいけた。
ちなみにchar *test[][]じゃむりなのな。
test[3]を宣言された個数だけ確保する、って感じか。勉強になったわ
0276デフォルトの名無しさん2005/11/06(日) 03:33:49

        ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
          ヽ ___\(\・∀・)<  まとめ更新まだー?
             \_/⊂ ⊂_)_ \_______
           / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
        |  ̄  ̄ ̄ ̄ ̄ ̄ ̄:| :|
        |           .|/
0277デフォルトの名無しさん2005/11/06(日) 03:34:55
更新は明日やるお
そろそろ寝るお
0278デフォルトの名無しさん2005/11/06(日) 03:56:50
まとめサイトがWebSphereで作られている時点で萎えた('A`)
0279デフォルトの名無しさん2005/11/06(日) 04:13:15
すっげー基本的なことのはずだけどファイル入出力ってあんまり使ったこと無い希ガス
たとえばRPG作るとしてセーブデータをどうやって処理するかとかやり方わかる?
0280デフォルトの名無しさん2005/11/06(日) 04:25:56
たぶんこんな感じ

まずどういう形式でセーブするかを考えて決める
たとえば最初にキャラクタ名が10文字、次に年齢が4文字、とか

それをふまえてセーブする時はファイルを開いてそこへ
コンソールに出力するのと同じみたいにして書き出してく

ロードする時はそのセーブしてあるはずのファイルを開いて
コンソールからの入力と同様の感じで読み出す

それをあらかじめ決めてあるデータ形式にそって解読

チート対策とかはまあそのうち考えれ
0281デフォルトの名無しさん2005/11/06(日) 04:37:39
ファイルに書き出すデータを格納する構造体を作っておいて、
必要なデータをそこに格納
fwriteで構造体ごとファイルに書き出して終了。
読み込むときもfreadで構造体丸ごと読み込む。
俺はこのあたりのやり方が簡単だと思うが、どうだろう?
0282デフォルトの名無しさん2005/11/06(日) 04:42:18
なんとそんな便利な機能があったのか
0283デフォルトの名無しさん2005/11/06(日) 04:46:46
フラグの類も全部書き出さないとダメなんだよなぁ
結構たいへんな構造体になりそうだね

cgiの掲示板とかはどうだろう
名前と本文と書き込み時間とメアドと・・・とかの区切りをどうやってやるべきだろう
RPGと違ってcgiのユーザは何するかわからないから変なデータをそのまま書き込むと
ファイルが読み込めなくなったりなんかしそう
0284デフォルトの名無しさん2005/11/06(日) 04:55:16
安全の面からも、変なデータはつっぱねるとか勝手に直すとかして
変じゃないデータだけが書きこまれるようにするのが吉かと思う

2ちゃんのdatは「<>」で区切っているね

俺が掲示板を作った時は「4個の改行」を区切りにしてみた
0285デフォルトの名無しさん2005/11/06(日) 07:32:29
VipperでもわかるC言語じゃなくてVIPPERにしかわからないC言語になりつつあるな。
0286デフォルトの名無しさん2005/11/06(日) 07:58:24
ひろゆきはこの事知ってるの?
0287デフォルトの名無しさん2005/11/06(日) 08:27:11
ひろゆきが知ってどうすんだ?
0288デフォルトの名無しさん2005/11/06(日) 08:29:33
とりあえずひろゆきって言いたいんだよ
0289デフォルトの名無しさん2005/11/06(日) 08:30:32
>>283
普通はjavascriptで不適切な入力のチェックをする。
CGIでチェックするのはお勧めできない。
0290デフォルトの名無しさん2005/11/06(日) 09:26:00
マクロは置き換わるって噂だけど、

#define ADD(a, b) (a+b)
int a = 10, b = 20, c;
とやって、

c = ADD(a, b); と c = a+b; はかかる時間は同じってことでおけ?
0291デフォルトの名無しさん2005/11/06(日) 10:04:47
>>290
どこかにぴろゆきとか隠し文字を入れないと駄目だって
>>286がいってます。
0292デフォルトの名無しさん2005/11/06(日) 10:15:22
プリプロセスで置き換えられるのでどちらも同等です。
0293デフォルトの名無しさん2005/11/06(日) 10:23:29
>>292
どうもありがとん♪
マクロ不使用の時の方が速いような気がして、どうしようかと思ってたのよ。
これで安心して次に行けるわぁ。

>>291
( ゚Д゚) それデフォですか!?
0294デフォルトの名無しさん2005/11/06(日) 10:37:37
子供にも大人気→http://ozv.hp.infoseek.co.jp/cgi-bin/upload/src/up0009.jpg
OP動画:http://up50.hp.infoseek.co.jp/cgi-bin/upload/src/up0005.wmv
OPフラッシュ:http://ozv.hp.infoseek.co.jp/cgi-bin/upload/src/up0011.swf
0295デフォルトの名無しさん2005/11/06(日) 11:33:18
セーブデータとかの改変を調べるなら、
フラグ、キャラデータ…ごとにmd5して、復元したそれぞれのデータのmd5値と一致するか調べるとかどうかなぁ。
0296デフォルトの名無しさん2005/11/06(日) 11:39:11
#include <stdio.h>
#define VIPQUALITY malloc(1)
int main(void) {
 while(1) {
  VIPQUALITY; //(^ω^)
 }
 return 0;
}
0297デフォルトの名無しさん2005/11/06(日) 11:40:39
間違えたwwwwww
直すのマンドクセwwwwwwwwww
0298デフォルトの名無しさん2005/11/06(日) 11:49:03
MD5ってどうやって求めるの?
0299デフォルトの名無しさん2005/11/06(日) 11:52:12
この場合"hello"はどこに逝くんだ?解放とかしなくていいのか?
free(str);ってやるとエラーでるし、よくわからん

#include <stdio.h>

int main()
{
    char *str;
    str="hello";
    str="again";
    printf("%s\n", str);
    return 0;
}
0300デフォルトの名無しさん2005/11/06(日) 12:04:51
>>299
文字列リテラルは、メモリ中のどこかに自動的に配置されるから
解放する必要はないの
0301デフォルトの名無しさん2005/11/06(日) 12:07:36
299じゃないけど、実行時にメモリ上に置かれて、終ったらOSか何かが勝手に片付けるという理解でおk?
0302デフォルトの名無しさん2005/11/06(日) 12:07:49
>>299
free()はmalloc()と対になるもので、動的に割り当てられたメモリを開放する。
文字列リテラルは最初からメモリに配置されてるもの(静的な割り当て)だから、
プロセスの開放時に同時に開放されるの。
0303デフォルトの名無しさん2005/11/06(日) 12:11:19
>>300
メモリ中のどこかには違いないんだけど、
システムの都合上、書き込み不可な場所の場合もあるから、
文字列リテラルを指してるポインタは書きかえちゃだめだよ。

ex.
char* str;
str = "hello".
strcpy( str, "string" ); // メモリ保護違反

>>301
OK.
0304デフォルトの名無しさん2005/11/06(日) 12:11:34
>>299
VC++とかでデバッグできる環境なら、プロセスメモリを覗くウィンドウがあるから、
それでアドレス指定して、どういう割り当て方されてるのか見てみるのも良いかも
0305デフォルトの名無しさん2005/11/06(日) 12:15:10
"〜"は文字列リテラル
正確には違うかもしれんがconst char*のようなもの
0306デフォルトの名無しさん2005/11/06(日) 12:16:05
うはwwwwすでに書かれまくりwww
意味ナッシング
0307デフォルトの名無しさん2005/11/06(日) 13:07:58
>>289
>>>283
>普通はjavascriptで不適切な入力のチェックをする。
>CGIでチェックするのはお勧めできない。
激しく遅レスだが、これは間違い
Javascriptでのチェックはバイパスされる可能性があるので、CGI側のチェックは必須
この基本を忘れて、パスワード抜かれたりするサイトが続発してる
03082862005/11/06(日) 13:58:59
ここにもうvipperはいないのかお・・
0309デフォルトの名無しさん2005/11/06(日) 14:05:52
アナリスカーならここにいますよ。スーッっとしてきたーっ!
アナリスク最高!
0310デフォルトの名無しさん2005/11/06(日) 14:17:12
VIPからきました( ^ω^)
0311デフォルトの名無しさん2005/11/06(日) 14:18:58
 *     +    巛 ヽ
            〒 !   + イヤッッホォォォオオォオウ!
      +    。  |  |
   *     +   / /   我等が偉大なる勇者達に幸運を。  *
       ∧_∧ / / .+   儚くも散っていった者達に冥福を。 +
      (´∀` / /.    .純愛スナイパー、鬼畜スナイパーには栄誉を。
      ,-     f
      / ュヘ.    | *   .
     〈_} )   |     
        /    ! +     
       ./  ,ヘ  |
 ガタン ||| j  / |  | |||    それがVIPクオリティ!
0312デフォルトの名無しさん2005/11/06(日) 14:39:18
//ファイル改ざんチェックつくってみた

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

//#define READONLY

typedef struct CHARA
{
    int hp;
    int mp;
    char name[9];
} CHARA;

unsigned char MDVip(char *data, int size)
{
    int i;
    int hash=0;
    for (i=0 ; i<size ; i++)
    {
        hash+=data[i];
    }
    return hash%255;
}

int main()
{
    const char *filename="savedata.dat";
    FILE *fp;
    CHARA yusya, mosyasu;
    unsigned char yusya_hash, mosyasu_file_hash, mosyasu_hash;
0313デフォルトの名無しさん2005/11/06(日) 14:39:52
    //ステータス設定
    yusya.hp=100;
    yusya.mp=128;
    strcpy(yusya.name, "もょもと");

    //保存
#ifndef READONLY
    yusya_hash=MDVip(&yusya, sizeof(yusya));


    fp=fopen(filename, "w");
    fwrite(&yusya, sizeof(yusya), 1, fp);
    fwrite(&yusya_hash, sizeof(yusya_hash), 1, fp);
    fclose(fp);
#endif

    //読み込み
    fp=fopen(filename, "r");
    fread(&mosyasu, sizeof(mosyasu), 1, fp);
    fread(&mosyasu_file_hash, sizeof(mosyasu_file_hash), 1, fp);
    fclose(fp);

    mosyasu_hash=MDVip(&mosyasu, sizeof(mosyasu));

    if (mosyasu_file_hash == mosyasu_hash)
    {
        printf("ファイルが改ざんされてない事を確認しました\n");
    }
    else
    {
        printf("ファイルが改ざんされています\n");
0314デフォルトの名無しさん2005/11/06(日) 14:40:30
    }
    printf("%d\n", mosyasu.hp);
    printf("%d\n", mosyasu.mp);
    printf("%s\n", mosyasu.name);

#ifndef READONLY
    printf("%d\n", yusya_hash);
#endif

    printf("%d\n", mosyasu_hash);
    printf("%d\n", mosyasu_file_hash);
}

//おわり
0315デフォルトの名無しさん2005/11/06(日) 14:47:04
>>312
乙
よく見てないけど、構造体はアライメント入っちゃうから#pragma pack(1)するといいお
ファイルのバイナリアクセスする場合はwbとrbにするといいお
あとmain()の戻り値忘れてるお
じゃあな
0316デフォルトの名無しさん2005/11/06(日) 14:57:23
よくわかんねーけど進行速度下げて。お願い。
0317デフォルトの名無しさん2005/11/06(日) 15:00:50
VIPPER老い易く
C成り難し
0318デフォルトの名無しさん2005/11/06(日) 15:16:13
進行速度は十分遅いだろ。これ以上下げるとNEETが逃げちゃうよ。
0319デフォルトの名無しさん2005/11/06(日) 15:21:07
誰か>>312の解説よろ
0320デフォルトの名無しさん2005/11/06(日) 15:32:36
全体的な解説と、一行一行細かい説明とどっちが希望だ?
0321デフォルトの名無しさん2005/11/06(日) 15:36:01
全体的な解説お願いします。
あとMDVip関数について詳しく。
0322デフォルトの名無しさん2005/11/06(日) 15:36:32
935 名前: デフォルトの名無しさん [sage] 投稿日: 2005/11/06(日) 15:25:10
このsageない基地外なんか過去から全部同じ椰子じゃないかとまで思ってしまう。
(ネタがつまらんのが致命的にキモイ)
0323デフォルトの名無しさん2005/11/06(日) 15:38:15
そうか、じゃあな
0324デフォルトの名無しさん2005/11/06(日) 15:38:21
Wikiを設置しようと思ったからTok2でアカウントとってる
0325デフォルトの名無しさん2005/11/06(日) 15:53:40
広告多いのは勘弁
0326デフォルトの名無しさん2005/11/06(日) 16:14:24
>>289
亀だけど、それはJavaScript切ってる奴とかもいるからまずいだろ
切ってると素通しになるっていうのもまずいし、切ってるとはじかれる
っていうのも不便でまずい
あとJavaScriptは手元で改造されてるかもしれないしな
0327デフォルトの名無しさん2005/11/06(日) 16:20:26
>>321
312じゃないが、勝手に解説
MDvipは、読み込んだデータを1バイト単位で足していって、合計を255で割った余りを取る関数。
もしも、データが改ざんされている場合、この計算結果が一致しなくなるから、改ざんを判断できる。
つまり、MDvip関数の戻り値が同じになるように改ざんされた場合は、改ざんを検出できない。

例)128,44,66,223という4バイトのデータを書き込む場合(全て10進数で説明)
128+44+66+223=461
461%255=206
保存するときは、4バイトのデータとともに、この206も保存する。

そして、読み込む際に、読み込んだデータから再計算する。
もしも、128、150、66、223のようにデータが改ざんされていたとすれば、
128+150+66+223=567
567%255=57
で、計算結果が一致しなくなる

248,164,81,223のような改ざんの場合
(248+164+81+223)%255=206
なので、こういったデータの改ざんの場合は検出できない

間違ってたら突っ込みよろしく
0328デフォルトの名無しさん2005/11/06(日) 16:35:23
>>327
なるほど〜、一つ一つのデータを暗号化するわけではなく、
全体の和を255で割った剰余を別に保存する訳ね。

おっけ、把握しました。
0329デフォルトの名無しさん2005/11/06(日) 16:54:59
>>325
ログインできなくてちんぽっぽ
0330デフォルトの名無しさん2005/11/06(日) 17:21:12
でかけてたお
まとめサイトはいまから更新するお
0331デフォルトの名無しさん2005/11/06(日) 17:23:15
転送量無限のGeocitiesマジオススメ
■ このスレッドは過去ログ倉庫に格納されています